1 概述
广播概念在计算机网络中就有,在一个IP网络范围中,最大的IP地址通常是被保留作为广播地址来使用的。
广播的含义就是一个广播发出,范围内的应用程序都能够收到该广播。
Android中的每个应用程序都可以对自己感兴趣的广播进行注册,注册后当广播发出时,就能够收到,可能是系统广播,也可能是其他应用程序的广播。
广播接收的应用中需要有类来继承BroadcastReceiver类。
广播按照分类可以分为两种:
- 标准广播:完全异步执行的广播,广播发出后,所有相关的BroadcastReceiver能够几乎在同一时间收到广播消息,没有先后顺序可言。这种广播效率较高,无法被截断。
- 有序广播:是一种同步执行的广播,同一时刻只会有一个BroadcastReceiver收到广播消息,当这个BroadcastReceiver中的逻辑执行完毕后,广播才会继续传递。
2 接收系统广播
2.1 动态注册监听时间变化
BroadcastReceiver属于Android四大组件之一,使用时需要注册,可以分为两种方式注册,在代码中注册是动态注册,在AndroidManifest.xml中注册是静态注册。
class MainActivity : ComponentActivity() {
lateinit var timeChangeReceiver: BroadcastReceiver
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
timeChangeReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
val date = Date(System.currentTimeMillis())
val dateStr = dateFormat.format(date)
Toast.makeText(context, "Now: $dateStr", Toast.LENGTH_SHORT)
.show()
}
}
val intentFilter = IntentFilter("android.intent.action.TIME_TICK")
registerReceiver(timeChangeReceiver, intentFilter)
}
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(timeChangeReceiver)
}
}
这里监听系统广播TIME_TICK,每一分钟,系统会发送一次该广播。在onCreate中注册,在onDestroy中注销,动态注册要记得注销。
Android提供了多种系统广播,查看完整的系统广播列表,可以到以下路径查看:
<Android SDK>/platforms/<api version>/data/broadcast_actions.txt
2.2 静态注册实现开机启动
动态注册的BroadcastReceiver可以自由的控制注册与注销,灵活性上有很大的优势,但是必须程序启动后才能够接收广播。静态注册则可以在程序未启动时注册广播。
class BootCompleteReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context, "BootCompleteReceiver: Boot completed", Toast.LENGTH_LONG).show()
}
}
AndroidManifest.xml
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
...
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
静态注册并声明对应权限
当系统启动完成时,会收到系统广播
需要注意的是,不要在onReceive方法中添加过多的逻辑或者进行任何耗时操作,因为BroadcastReceiver中是不允许开启线程的,当onReceive方法运行了较长时间而没有结束时,程序会出现错误。
3 发送自定义广播
3.1 发送标准广播
自定义广播,并发送广播。自定义就是定义广播的action
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
BroadcastDemoTheme {
// A surface container using the 'background' color from the theme
Surface(
modifier = Modifier,