Android开机相关

本文详细描述了Android13中对开机广播流程的更新,特别是如何处理deferred接收者,以及BroadcastDispatcher中DeferredBootCompletedBroadcastPerUser的作用,第三方应用需注意对LOCKED_BOOT_COMPLETED和BOOT_COMPLETED的特殊管理。
摘要由CSDN通过智能技术生成

在这里插入图片描述以上是Android系统广播的流程,从Android13起逻辑上有变更,主要是对Android开机广播做了特殊处理。

    if (Intent.ACTION_LOCKED_BOOT_COMPLETED.equals(r.intent.getAction())) {
        // Create one BroadcastRecord for each UID that can be deferred.
        final SparseArray<BroadcastRecord> deferred =
                r.splitDeferredBootCompletedBroadcastLocked(mQueue.mService.mInternal,
                        mQueue.mService.mConstants.mDeferBootCompletedBroadcast);
        getDeferredPerUser(r.userId).enqueueBootCompletedBroadcasts(
                Intent.ACTION_LOCKED_BOOT_COMPLETED, deferred);
        if (!r.receivers.isEmpty()) {
            // The non-deferred receivers.
            mOrderedBroadcasts.add(r);
            return;
        }
    } else if (Intent.ACTION_BOOT_COMPLETED.equals(r.intent.getAction())) {
        // Create one BroadcastRecord for each UID that can be deferred.
        final SparseArray<BroadcastRecord> deferred =
                r.splitDeferredBootCompletedBroadcastLocked(mQueue.mService.mInternal,
                        mQueue.mService.mConstants.mDeferBootCompletedBroadcast);
        getDeferredPerUser(r.userId).enqueueBootCompletedBroadcasts(
                Intent.ACTION_BOOT_COMPLETED, deferred);
        if (!r.receivers.isEmpty()) {
            // The non-deferred receivers.
            mOrderedBroadcasts.add(r);
            return;
        }
    } else {
        mOrderedBroadcasts.add(r);
    }
}

其中很关键的代码,在特定场景会使用某些开机广播注册者无法收到开机广播:
final SparseArray deferred =
r.splitDeferredBootCompletedBroadcastLocked(mQueue.mService.mInternal,
mQueue.mService.mConstants.mDeferBootCompletedBroadcast);
getDeferredPerUser(r.userId).enqueueBootCompletedBroadcasts(
Intent.ACTION_BOOT_COMPLETED, deferred);

追踪mDeferBootCompletedBroadcast可知默认情况下后台及targetSdkVersion is T的开机广播接收者将会归为延时接收。

BroadcastDisppatcher中新增一个DeferredBootCompletedBroadcastPerUser,管理延时LOCKED_BOOT_COMPLETED,BOOT_COMPLETED的接收者。对于一个第三方应用中注册的开机广播往往会有这里做特殊处理,存放在SparseArray mDeferredBootCompletedBroadcasts = new SparseArray<>(),后续也是从此取出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值