一、BroadcastReceiver的基本使用原理
使用观察者模式,发送者通过IPC向AMS发送广播,接收者通过IPC向AMS注册,AMS会根据发送者的要求寻找合适的接受者通过IPC发送广播,接收者在消息循环中解决接收到的广播。
注册接收者分动态注册和静态注册,静态注册在AndroidManifest中使用<receiver>标签注册,动态注册推荐在Activity的onResume和onPause方法中注册注销。
AMS寻找接收者根据IntentFilter和Permisson两个条件。
二、广播分类
普通广播:自定义intent广播
系统广播:内置的系统操作广播
有序广播:针对接收者有序,可以设置优先级,接收者可以拦截或者修改转发
粘性广播:已弃用
App应用内广播:局部广播,安全性及效率高
三、注册过程
contextImpl.registerReceiver->registerReceiverInternal->(IPC)AMS.registerReceiver(
IApplicationThread, packageName, IIntentReceiver, filter,broadCastPermission,,
)
/*
和Service的绑定过程类似
LoadedApk--ReceiverDispatcher—InnerReceiver(IIntentReceiver)—BroadcastReceiver
LoadedApk--ServiceDispatcher—InnerConnection(IServiceConnection)—ServiceConnection
但是接收的时候AMS会把InnerReceiver的代理对象直接传回来,而不是调用
*/
AMS存储InnerReceiver->ReceiverList->HashMap<IBinder, ReceiverList>和IntentFilter保存起来
四、发送与接收过程
发送给AMS
contextImpl.sendBroadcast(intent)->
ContextImpl.sendBroadcast(IApplicationThread,intent, …,Bundle
bOption, …)
->(IPC)AMS.broadcastIntent->AMS.broadcastIntentLocked(在sychronized块中)
根据过滤器生成List对象receivers(接收者列表)
创建BroadcastRecord对象,并equeue入队BroadcastQueue
AMS分发
——若是有序广播,则顺序分发,若是非有序广播,先分发动态注册的广播,一次性发完,然后分发静态注册的广播,和有序广播一样一个发送完再发下一个。
BroadcastQueue.scheduleBroadcastLocked->sendMessage->processNextBroadcast
「1.判断权限2.判断接收者进程是否存在」
->(IPC)主线程的scheduleRegisterReceiver->InnerReceiver.performReceiver->
接收
主线程ActivityThread.post(args.getRunnable)
// LoadedApk调用主线程handler发布广播ReceiverDispatcher.Args.runnable对象
args.run->ReceiverDispatcher.BroadcastReceiver.onReceived
上述是根据源码得出的过程,其他详细信息也可参考:
https://www.jianshu.com/p/dd04e6d97de0