Android中ANR的触发机制-BroadcastReceiver篇

个人博客

http://www.milovetingting.cn

Android中ANR的触发机制-BroadcastReceiver篇

上一篇分析了Service中的ANR触发机制,这一篇来分析BroadcastReceiver的ANR触发机制。

触发机制分析

附上时序图

BroadcastReceiver的ANR机制

注册过程

要分析BroadcastReceiver的ANR机制,先来看BroadcastReceiver的register过程,静态注册这里不作分析。

不管Activity还是Service中的registerReceiver,最终都是调用ContextWrapper中的registerReceiver方法

@Override
    public Intent registerReceiver(
        BroadcastReceiver receiver, IntentFilter filter) {
   
        return mBase.registerReceiver(receiver, filter);
    }

看下ContextImpl的registerReceiver方法

//ContextImpl
@Override
    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
   
        return registerReceiver(receiver, filter, null, null);
    }

这个方法调用另一个重载方法

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

这个方法调用registerReceiverInternal方法

//ContextImpl
private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId,
            IntentFilter filter, String broadcastPermission,
            Handler scheduler, Context context, int flags) {
   
        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);
            } else {
   
                if (scheduler == null) {
   
                    scheduler = mMainThread.getHandler();
                }
                rd = new LoadedApk.ReceiverDispatcher(
                        receiver, context, scheduler, null, true).getIIntentReceiver();
            }
        }
        try {
   
            //调用AMS的registerReceiver方法
            final Intent intent = ActivityManager.getService().registerReceiver(
                    mMainThread.getApplicationThread(), mBasePackageName, rd, filter,
                    broadcastPermission, userId, flags);
            if (intent != null) {
   
                intent.setExtrasClassLoader(getClassLoader());
                intent.prepareToEnterProcess();
            }
            return intent;
        } catch (RemoteException e) {
   
            throw e.rethrowFromSystemServer();
        }
    }

调用AMS的registerReceiver方法,这里传入了LoadedAPK$ReceiverDispatcher类型的对象

//AMS
public Intent registerReceiver(IApplicationThread caller, String callerPackage,
            IIntentReceiver receiver, IntentFilter filter, String permission, int userId,
            int flags) {
   
            //...
            ReceiverList rl = mRegisteredReceivers.get(receiver.asBinder());
            if (rl == null) {
   
                rl = new ReceiverList(this, callerApp, callingPid, callingUid,
                        userId, receiver);
                if (rl.app != null) {
   
                    final int totalReceiversForApp = rl.app.receivers.size();
                    if (totalReceiversForApp >= MAX_RECEIVERS_ALLOWED_PER_APP) {
   
                        throw new IllegalStateException("Too many receivers, total of "
                                + totalReceiversForApp + ", registered for pid: "
                                + rl.pid + ", callerPackage: " + callerPackage);
                    }
                    rl.app.receivers.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值