安卓学习Android开发

一张图学习广播的注册发送和接收原理

2019-03-01  本文已影响0人  小怪兽大作战

注册

静态注册

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方法。

上一篇下一篇

猜你喜欢

热点阅读