目录
- 一 前言
- 二 分类
- 2.1 标准广播
- 2.1.1 动态注册
- 2.1.2 静态注册
- 2.1.3 带权限的标准广播
- 2.2 有序广播
- 2.3 系统广播
一 前言
BroadcastReceiver是四大组件之一,用于组件间通信,底层是binder机制。注:(贴的代码是Compose写的且不规范,可能会与原生有部分出入,但是思路一样)。
二 分类
可分为标准广播和有序广播。
2.1 标准广播
异步执行。所有广播接收器同时收到广播,没有先后顺序。
2.1.1 动态注册
1.自定义广播接收器
class MyBroadcastReceiver: BroadcastReceiver() {override fun onReceive(p0: Context?, p1: Intent?) {p0?.let {Toast.makeText(it, "收到广播", Toast.LENGTH_SHORT).show()}}
}
2.注册广播接收器
// 注册广播
val filter = IntentFilter()
filter.addAction("com.tian.broadcastdemo.action.test")
registerReceiver(receiver, filter)
3.发送广播
Button(onClick = {// 发送广播val intent = Intent("com.tian.broadcastdemo.action.test")intent.putExtra("data", "Hello World!")context.sendBroadcast(intent)}) {Text(text = "发送广播")}
4.注销广播
override fun onDestroy() {unregisterReceiver(receiver);super.onDestroy()}
效果:
点击按钮后弹出吐司。
2.1.2 静态注册
1.自定义广播接收器
class MyBroadcastReceiver: BroadcastReceiver() {override fun onReceive(p0: Context?, p1: Intent?) {p0?.let {Toast.makeText(it, "收到广播", Toast.LENGTH_SHORT).show()}}
}
2.在AndroidManifest.xml 中进行注册
<receiver android:name=".MyBroadcastReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="com.tian.broadcastdemo.action.test"/></intent-filter>
</receiver>
enabled 设置为 true,能够接受到信息 ;
exported 为 true能够接收到外部应用(apk)广播的信息。
2.1.3 带权限的标准广播
接收端manifest里面加权限,发送端代码中加权限;可以只让指定的应用收到广播,防止监听。
2.2 有序广播
同步执行。所有广播接收器依次收到广播,有先后顺序。
前面的广播可以对后面的广播进行截断。
可以设置优先级,看源码
-1000 到 1000,越大越高。如下:
filter.priority = 99
截断广播:
abortBroadcast()
2.3 系统广播
如系统时间改变、电量低、开机启动等。使用方法也是静态注册、动态注册,不过多介绍。