四大组件BroadcastReceiver的工作过程

本文详细解析BroadcastReceiver在Android中的工作过程,包括广播的静态和动态注册,以及发送和接收的具体步骤,涉及ContextWrapper的registerReceiver(), ActivityManagerNative的broadcastIntentLocked(), BroadcastQueue的scheduleBroadcastLocked()等关键环节。" 104426746,5843711,Vue.js中vm.$nextTick的实现原理与应用,"['Vue', '前端开发', 'JavaScript', '异步处理']
摘要由CSDN通过智能技术生成

BroadcastReceiver的工作过程主要包含两方面的内容,一个是广播的注册,一个是广播的发送和接收。


广播的注册分为两种:

1)静态注册:

直接在Manifest.xml中实现<receiver>,到时会由 PackageManagerService完成整个注册过程
<receiver android:name=".MyReceiver">
    <intent-filter>
        <action android:name="com.yyp.receiver.LAUNCH"/>
    </intent-filter>
</receiver>


2)动态注册:

通过registerReceiver()注册
IntentFilter filter = new IntentFilter();
filter.addAction("com.yyp.receiver.LAUNCH");
registerReceiver(new MyReceiver(), filter);



通过sendBroadcast()发送广播
Intent intent = new Intent();
intent.setAction("com.yyp.receiver.LAUNCH");
sendBroadcast(intent);



一、BroadcastReceiver的注册过程


1、从ContextWrapper的registerReceiver()开始

调用ContextImpl的registerReceiver(),registerReceiver()再调用registerReceiverInternal()。

2、registerReceiverInternal()

首先从PackageInfo的getReceiverDispatcher方法获取IIntentReceiver对象,其中InnerReceiver对象和BroadcastReceiver都是在ReceiverDispatcher的构造方法中被保存起来,然后调用ActivityManagerNative.getDefault().registerReceiver(),最终会把远程的InnerReceiver对象以及IntentFilter对象存储起来,注册过程就完成了。

二、BroadcastReceiver的发送和接收过程


广播的发送类型有: 普通广播、有序广播和粘性广播,有序广播和粘性广播与普通广播相比具有不同特性,但是发送和接收的过程是类似的。

1、从ContextWrapper的sendBroadcast()开始

调用ContextImpl的sendBroadcast(),sendBroadcast()再调用ActivityManagerNative.getDefault().broadcastIntent()。

2、ActivityManagerNative.getDefault().broadcastIntent()内部调用broadcastIntentLocked()

在broadcastIntentLocked()内部,会根据intent-filter查找出匹配的广播接收者,然后经过条件过滤,将满足条件的广播接收者添加到BroadcastQueue中。

3、BroadcastQueue的scheduleBroadcastLocked()将广播发送给相应的广播接收者

此方法并没有立即发送广播,而是发送BROADCAST_INTENT_MSG消息,BroadcastQueue收到消息后会调用processNextBroadcast方法,把广播发送给对应的接收者。

4、processNextBroadcast()调用deliverToRegisteredReceiverLocked()

这个方法负责将一个广播发送给特定的接收者,内部调用performReceiverLocked完成具体的发送过程。

5、performReceiverLocked()调用ApplicationThread的scheduleRegisteredReceiver()

内部调用InnerReceiver的performReceive方法,然后performReceive会调用LoadedApk.ReceiverDispatcher的performReceive方法,创建一个Args对象并通过ActivityThread的post方法来执行Args中的逻辑,这个时候BroadcastReceiver的onReceive方法被执行了,也就是应用接收到广播了。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值