IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android AlarmManage+BroadcastReceiver+Service通知栏实现推送(后台被清也能实现)Kotlin -> 正文阅读

[移动开发]Android AlarmManage+BroadcastReceiver+Service通知栏实现推送(后台被清也能实现)Kotlin

????????目录

一、背景

二、新建AlarmService类,继承Service

三、新建AlarmReceiver,继承BroadcastReceiver

四、MainActivity

五、布局

六、补充


一、背景

AndroidStudio版本2021.2.1,sdk版本29以上

最近写软件碰到一个问题——消息推送,还是那种不需要挂在后台就能实现推送效果的功能。

直接看代码吧。

二、新建AlarmService类,继承Service

这个服务用来启动AlarmManage,当然可以根据自己喜欢放在activity里,效果一样。

class AlarmService : Service() {
    override fun onBind(p0: Intent?): IBinder? {
        return null
    }

    @SuppressLint("UnspecifiedImmutableFlag")
    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        val manager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
//设置这个intent,是为了能够准确通知到广播
        val i = Intent("toAlarmReceiver")
        Log.i("test1", "onStartCommand: $packageName, $packageName.receiver.AlarmReceiver")
        i.component = ComponentName(packageName, "$packageName.receiver.AlarmReceiver")
        val pendingIntent =
            PendingIntent.getBroadcast(this, 0, i, PendingIntent.FLAG_CANCEL_CURRENT)
//这个Int类型的time是前台activity传过来的
        val time = intent.getIntExtra("time", 0)
        manager.setAndAllowWhileIdle(
            AlarmManager.RTC_WAKEUP,
            System.currentTimeMillis() + time * 1000L,
            pendingIntent
        )
        return super.onStartCommand(intent, flags, startId)
    }
}

关于AlarmManager.RTC_WAKEUP,可以看文章结尾,我的参考文章。

三、新建AlarmReceiver,继承BroadcastReceiver

使用广播能够实现在关闭app后台的时候,接收讯息实行操作。

class AlarmReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
//设置通知的一些必要信息,都是字面意思
        val notify = NotificationCompat.Builder(context, "xxm")
            .setSmallIcon(R.mipmap.ic_launcher_round)
            .setContentTitle("标题")
            .setContentText("看通知,看通知哦!").build()
        val manager =
            context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        manager.notify(1, notify)
    }
}

关于notification和BroadcastReceiver,在activity里还有操作。

四、MainActivity

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    @SuppressLint("ShortAlarm")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        //注册NotificationChannel,Android8之后需要,可根据自己选择
        val channel = NotificationChannel("xxm", "通知", NotificationManager.IMPORTANCE_HIGH)
        val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
        manager.createNotificationChannel(channel)
        //动态注册BroadcastReceiver
        val receiver = AlarmReceiver()
        val filter = IntentFilter()
        filter.addAction("toAlarmReceiver")
        registerReceiver(receiver, filter)
        //点击函数
        click()
    }

    private fun click() {
        binding.btn.setOnClickListener {
            val input = binding.edt.text.toString().trim()
            if (input.isNotEmpty()) {
                val intent = Intent(this, AlarmService::class.java)
                intent.putExtra("time", input.toInt())
                startService(intent)
            }
        }

    }
}

这里说一下NotificationChannel,这是Android官方要求,如果直接使用NotificationCompat.Builder(context)来构造通知,而不带channel的参数,会被系统提示该方法已被弃用。

还有就是广播,不只要在Manifest清单中注册,还要动态注册,具体可自行百度。

五、布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="14dp"
        android:layout_marginEnd="14dp"
        android:orientation="horizontal"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.319">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="延迟推送时间:"
            android:textSize="18sp" />

        <EditText
            android:id="@+id/edt"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:inputType="number"
            android:textSize="18sp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="秒"
            android:textSize="18sp" />
    </LinearLayout>

    <Button
        android:id="@+id/btn"
        android:layout_width="140dp"
        android:layout_height="wrap_content"
        android:text="开始"
        android:textSize="18sp"
        android:layout_marginTop="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout" />


</androidx.constraintlayout.widget.ConstraintLayout>

这个很简单,就不多说了。

六、补充

在真机测试的时候,要记得开启通知权限,打开自启动。我用的miui,打开自启动,省电策略无限制,通知设为重要,并且允许悬浮通知。

最后问一下,输入小于5秒时,Alarm会默认延迟5秒,这个还请各位大神指点一二。

附上demo地址,需要自行下载

欢迎批评指点。

参考:Android 接收不到广播的原因解决? ? ?Android之AlarmManger

??????????

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 19:00:48  更:2022-07-20 19:01:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 2:46:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码