(十九)四大组件的工作过程-BroadcastReceiver

广播的注册过程
静态广播在程序安装时由系统自动完成注册,具体是由PMS来完成注册
动态广播:
    1、由ContextWrapper的registerReceiver方法开始,交给ContextImpl的registerReceiver方法来处理。
    2、ContextImpl的registerReceiver方法调用自己的registerReceiverInternal方法
    3、在registerReceiverInternal方法里会通过getReceiverDispatcher方法获取IIntentReceiver对象,IIntentReceiver的具体实现是通过
         LoadedAPK的ReceiverDispatcher.InnerReceiver方法实现的,ReceiverDispatcher是连接BroadcastReceiver和InnerReceiver的桥梁,类似Service中的关系。
    4、在得到返回的InnerReceiver对象之后,在AMS的registerReceiver方法里将其与IntentFilter对存储起来。




广播的发送与接受过程
广播分为普通广播、有序广播、粘性广播等。
1、从ContextWrapper的sendBroadcast方法开始,还是到ContextImpl的sendBroadcast方法里,调用AMS的broadcastIntent方法。
2、broadcastIntent方法里调用broadcastIntentLocked方法,该方法中会对Intent设置标记Flags,如:FLAG_INCLUDE_STOPPED_PACKAGE和FLAG_EXCLUDE_STOPPED_PACKAGE等,对已经停止的程序是否要接受广播;根据Intent-filter找出匹配的广播接受者并经过条件过滤将,把满足条件的广播接受者添加到BroadcastQueue中,BroadcastQueue会通过queue.scheduleBroadcastLocked方法将广播发送给满足条件的接受者;该方法并没有立即发送广播,只是发送一个消息,BroadcastQueue收到消息后,会调用processNextBroadcast方法;processNextBroadcast方法中无序广播是存储在mParallelBroadcasts中,系统会遍历它并将广播发送给接受者,具体过程是deliverToRegisteredReceiverLocked方法完成;它内部调用performReceiverLocked方法,该方法内部调用app.thread.scheduleRegisteredReceiver方法;该方法通过InnerReceiver实现广播接受,InnerReceiver的performReceive方法调用ReceiverDispatcher的performReceive方法;在该方法里会创建一个Args对象并通过mActivityThread的post方法执行逻辑,在Args中会回调客户端的eonReceive方法。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值