关于BroadcastReceiver

一、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, IIntentReceiverfilter,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值