一张图学习广播的注册发送和接收原理
注册
静态注册
APP在安装的时候,PackageManagerService会解压apk,并自动注册静态接收器。
动态注册
动态注册由工作主要由ActivityManagerService来完成。
参考下图
image.png
1.context.registerReceiver(IntentFilter,BroadcastReceiver)调用contextWrapper.registerReceiver(IntentFilter,BroadcastReceiver).
2.contextWrapper.registerReceiver(IntentFilter,BroadcastReceiver)调用contextImpl.registerReceiver(IntentFilter,BroadcastReceiver),将BroadcastReceiver封装成IIntentReceiver对象,该对象继承binder,用于进程间通信。
3.最终调用 ActivityManagerNative.getDefault.registerReceiver。ActivityManagerNative.getDefault获得AMS的代理,用于和AMS通信。
4.真正注册receiver的逻辑在AMS。AMS获取IntentFilter和IIntentReceiver,将他们保存起来。
发送广播和接收广播
AMS是广播发送者和广播接收者的媒介。AMS中保存有所有的接收者,通过遍历接收者,通过binder和接收者进行通信,调用接收者的onReceiver。
如下图所示
image.png
1.广播发送者调用contxt.sendBroadcast(intent)。最终会调用ActivityManagerNative.getDefault.broadcastIntent(intent,ApplicationThread)。
2.ActivityManagerNative.getDefault获得AMS的代理,用户和AMS通信。
3.AMS中首先为intent添加FLAG_EXCLUDE_STOP_PACKAGE。默认不向已关闭的APP发送广播。遍历注册时保存的接收者,向与intentFilter匹配的接收者发出广播。
4.通过接收者的ApplicationThread进行跨进程通信。接收者的ActivityThread线程将消息交给handler处理。handler调用接收者的onReceive方法。