一,什么是广播?
广播, 做为Android的四大组件之一,被用于发送和接收,来自系统或其它app的消息。其设计原理,是基于观察者模式来设计的,即先订阅,后接收。广播消息,并不受限于某一个单一进程。因此,它可以用于跨进程间的通信,在多个App之间传递消息。
二,广播的分类。
根据广播的订阅(定义)方式和生命周期,我们可以将广播归纳为2种类型,即静态广播与动态广播。
- 静态广播
静态注册的广播,在App被安装后,就自动被系统的PackageManager注册保存起来。这样,哪怕你的app,没有在运行,你的app也可以接收到广播。订阅这样一个广播,我们需要分2步实现。第1步,是创建一个类,继承自BroadcastReceiver。第2步,是在配置清单文件(AndroidManifest.xml)里面,进行配置第1步所创建的类。
- 创建继承自BroadcastReceiver的类,代码如下:
class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// 当接收到广播时,这个方法会被调用,intent参数,包含了广播所附带的数据。
}
}
- 在AndroidManifest.xml里面,配置刚刚定义的类。这个<receiver></receiver>标签,必须放在<application></application>标签中间,与<activity/>标签同层级。
<receiver android:name=".MyBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
</intent-filter>
</receiver>
- 动态广播
动态广播,是指通过代码,来动态订阅。每一个动态广播,都绑定一个上下文Context,要么是某个Activity的,要么是Application的。它的特点是,生命周期只局限于某个页面的生命周期,亦或是App的生命周期。当绑定广播的Activity或App被销毁后,就无法再接收广播。同样地,订阅这样一个广播,我们需要分2步走。第1步,是创建一个类,继承自BroadcastReceiver,熟悉的配方,一样的方式。第2步,创建该类的实例。
- 创建继承自BroadcastReceiver的类,代码如下:
class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// 当接收到广播时,这个方法会被调用,intent参数,包含了广播所附带的数据。
}
}
- 创建BroadcastReceiver子类的实例,代码如下:
val br: BroadcastReceiver = MyBroadcastReceiver()
- 创建IntentFilter,添加订阅事件,并注册广播。
val filter = IntentFilter()
// 添加要订阅的广播事件
filter.addAction(Intent.ACTION_SCREEN_OFF)
// 注册广播
registerReceiver(br, filter)