Android广播

166 阅读2分钟

前言

Android广播机制、原理、接收者、发送者和分发中心。类似于观察者模式,动态广播和静态广播;

image.png

广播机制

全局事件通知机制,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)
}

广播的设计模式是观察者模式(发布--订阅模式)

image.png

image.png

广播机制是全局事件通知机制,每个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进程是不能使用它。