前言
Android广播机制、原理、接收者、发送者和分发中心。类似于观察者模式,动态广播和静态广播;
广播机制
全局事件通知机制,App进程之间或App进程内把事件发送给事件监听者(BroadcastReceiver)。解除代码耦合,提升开发效率。
// 广播的action
val BROADCAST_ACTION = "com.george.broadcast.demo"
// 广播接收者
val broadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
// 接受到相应广播
}
}
// 注册广播,动态广播接收者
fun registerBroadCast(){
val intentFilter = IntentFilter(BROADCAST_ACTION)
registerReceiver(broadcastReceiver,intentFilter)
}
// 发送广播
fun sendBroadCast(){
val intent = Intent(BROADCAST_ACTION)
// 发送有序广播
sendOrderedBroadcast(intent,null)
}
广播的设计模式是观察者模式(发布--订阅模式)
广播机制是全局事件通知机制,每个App(进程内)存在一个或多个广播接收者(BroadCastReceiver)。广播分发中心位于systemserver进程,由AMS、BroadCastQueue、BroadcastDispatcher等组成。
广播发送者位于APP进程或systemserver等进程中。
我们的BroadCastReceiver通过InnerReceiver注册到广播分发中心,当有消息时,InnerReceiver对象把消息间接分发到BraodcastReceiver对象。
调用ActivityManager的registerReceiverWithFeature方法,最终调用到AMS方法。
静态广播接收者
<receiver android:name=".MyReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.george.myReceiver" />
</intent-filter>
</receiver>
动态广播接收者,必须所在进程存活才能收到。静态广播接收者,不依附于进程是否存活,如果所在进程不存活则会拉活进程接收消息(之前常用于保活app)。一般系统APP才可以使用静态广播接收者。
Context的sendBroadcast发送无序广播,sendOrderBraodcast发送有序广播。
系统广播:只有系统的一些App或者systemserver进程才能发送的广播,如:android.intent.action.SCREEN_ON。
普通广播:普通APP发送的广播,不能发送系统广播,否则抛出异常。
快速检索注册信息:通过action去检索注册信息ArrayMap<String, BroadcastFilter[]>信息。
offload分发广播:主要处理boot complete广播分发,系统启动时候的广播分发都是由它处理,App进程是不能使用它。