【源码分析】BroadcastReceiver启动源码分析

1.实际使用流程
(1). 创建一个类继承自BroadcastReceiver
(2). 注册:静态注册,动态注册
(3). 消息发送

创建一个类:
public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        
    }
}

静态注册 在AndroidManifest.xml文件里面添加:
  <receiver android:name=".MyReceiver">
            <intent-filter>
                <action android:name="com.mirko.reveicer.LANUCH"/>
            </intent-filter>
        </receiver>

或者动态注册:
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.mirko.reveicer.LANUCH");
        registerReceiver(new MyReceiver(),filter);
        
发送消息:

		Intent intent1 = new Intent();
        intent1.setAction("com.mirko.reveicer.LANUCH");
        sendBroadcast(intent1);


  1. 广播注册过程

注册分为动态注册和静态注册,静态广播在应用安装时完成注册,下面看动态广播注册的流程:

registerReceiver() —> ContextImpl里面的registerReceiver()—>进入 registerReceiverInternal() 创建ReceiverDispatcher对象 返回InnerReceiver,同时调用AMS里面的registerReceiver()–> 进入AMS的registerReceiver()方法,储存InnerReceiver及IntentFilter 完成广播注册

/**
	mBase.registerReceiver执行的是 ContextImpl里面的registerReceiver()方法
**/
Override
public Intent registerReceiver(
    BroadcastReceiver receiver, IntentFilter filter) {
    return mBase.registerReceiver(receiver, filter);
}

@Override
 public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
     return registerReceiver(receiver, filter, null, null);
 }
 
@Override
 public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
         String broadcastPermission, Handler scheduler) {
     return registerReceiverInternal(receiver, getUserId(),
             filter, broadcastPermission, scheduler, getOuterContext());
 }

/**
	通过调用后,进入registerReceiverInternal()方法
	1. mPackageInfo.getReceiverDispatcher()方法获取IntentReceiver对象
	2. 通过跨进程注册广播,在AMS里面完成
**/
private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId,
            IntentFilter filter, String broadcastPermission,
            Handler scheduler, Context context) {
        IIntentReceiver rd = null;
        if (receiver != null) {
            if (mPackageInfo != null && context != null) {
                if (scheduler == null) {
                    scheduler = mMainThread.getHandler();
                }
                rd = mPackageInfo.getReceiverDispatcher(
                    receiver, context, scheduler,
                    mMainThread.getInstrumentation(), true); // 1.获取IntentReceiver对象
            } else {
                if (scheduler == null) {
                    scheduler = mMainThread.getHandler();
                }
                rd = new LoadedApk.ReceiverDispatcher(
                        receiver, context, scheduler, null, true).getIIntentReceiver();
            }
        }
        try {
            final Intent intent = ActivityManagerNative.getDefault().registerReceiver(
                    mMainThread.getApplicationThread(), mBasePackageName,
                    rd, filter, broadcastPermission, userId); //2.通过跨进程注册广播,在AMS里面完成
            if (intent != null) {
                intent.setExtrasClassLoader(getClassLoader());
                intent.prepareToEnterProcess();
            }
            return intent;
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

/**
	进入getReceiverDispatcher()方法
	1.创建ReceiverDispatcher对象,构造方法中保存InnerReceiver和BroadcastReceiver
	2.返回InnerReceiver
**/
public IIntentReceiver getReceiverDispatcher(BroadcastReceiver r,
         Context context, Handler handler,
         Instrumentation instrumentation, boolean registered) {
     synchronized (mReceivers) {
         LoadedApk.ReceiverDispatcher rd = null;
         ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher> map = null;
         if (registered) {
             map = mReceivers.get(context);
             if (map != null) {
                 rd = map.get(r);
             }
         }
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值