Android | BroadcastReceiver
Android BroadcastReceiver
BroadcastReceiver 概念
应用与 Android 系统或者其他应用之间可以相互收发广播消息,便于进行系统级别的消息通知。应用可以注册接收特定的广播。广播发出后,系统会自动将广播传送给同意接收这种广播的应用。
广播分类
- 标准广播
normal broadcasts
:完全异步执行的广播,广播发出之后,所有的BroadcastReceiver
几乎会在同一时刻收到这条广播消息,之间没有任何先后顺序可言,无法被截断。 - 有序广播
ordered broadcasts
:同步执行的广播,在广播发出之后,同一时刻只会有一个BroadcastReceiver
能够收到这条广播消息,当这个BroadcastReceiver
中的逻辑执行完毕后,广播才会继续传递。所以此时的BroadcastReceiver
是有先后顺序的,优先级高的BroadcastReceiver
就可以先收到广播消息,并且前面的BroadcastReceiver
还可以截断正在传递的广播。
广播接收
静态注册
在清单文件 AndroidManifest.xml
中声明注册
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver
android:name=".MyAppBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
上述代码静态注册方式接收开机广播,需要注意的是对敏感操作进行权限声明。
动态注册
新建一个类,让它继承自 BroadcastReceiver
,并重写父类的 onReceive()
方法。当不再需要接收器或上下文不再有效时,动态注册的 BroadcastReceiver
一定要取消注册,调用 unregisterReceiver(android.content.BroadcastReceiver)
。
var br : timeChangeReceiver: TimeChangeReceiver
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intentFilter = IntentFilter()
intentFilter.addAction("android.intent.action.TIME_TICK")
timeChangeReceiver = TimeChangeReceiver()
registerReceiver(timeChangeReceiver, intentFilter)
}
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(timeChangeReceiver)
}
inner class TimeChangeReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context, "changed", Toast.LENGTH_SHORT).show()
}
}
广播发送
sendBroadcast(Intent)
:标准广播,按随机的顺序向所有接收器发送广播,接收器无法从其他接收器读取结果,无法传递从广播中收到的数据,也无法中止广播。sendOrderedBroadcast(Intent, String)
:有序广播,一次向一个接收器发送广播。当接收器逐个顺序执行时,接收器可以向下传递结果,也可以完全中止广播,使其不再传递给其他接收器。接收器的运行顺序可以通过匹配的 intent-filter 的 android:priority 属性来控制;具有相同优先级的接收器将按随机顺序运行。LocalBroadcastManager.sendBroadcast
:会将广播发送给与发送器位于同一应用中的接收器。如果不需要跨应用发送广播,则应使用本地广播。