在KITKAT 4.4.2中连续处理启动完成广播<action_boot_completed> <activitymanagerservice.java> </activitymanagerservice.java> </action_boot_completed>

时间:2014-02-10 06:27:01

标签: android performance initialization broadcastreceiver boot

在最新的Android版本中发送ACTION_BOOT_COMPLETED广播的方式似乎有一个非常重要的变化。 在JB 4.3中,并行处理了引导完成广播。与KK 4.4.2中的情况一样,它是连续处理的。 这是在启动后延迟服务的开始。

KITKAT 4.4.2

JELLY BEAN 4.3

由于Google的这一变化,我的服务启动在启动完成后会延迟。 可以观察到设备变得迟缓并且用于触摸的音频不会播出。所有这些都是因为各自的服务起步较晚。

另外,从日志中我看到第一个在发出后接收ACTION_BOOT_COMPLETED的人在16-19秒之后收到它,而在JBP上,接收队列中的第一个人几乎不需要10毫秒得到它。

任何知道这一变化的人都可以解释为什么会这样做。 这将是一个很大的帮助。

非常感谢!

3 个答案:

答案 0 :(得分:1)

改变是由@hackbod做出的,也许她可以说明原因。

她的签到说明:

  

完成问题#10779747:观察到日历存储崩溃......

     

...在设置中设置新用户时。

     

我们现在可以在有足够的后台服务时延迟广播   当前正在启动(对于svelte设备仍为1,对于正常设备为3   设备)。

     

添加新的意图标志以禁止接收者中止广播,其中   我用来修复初始BOOT_COMPLETED广播的问题   实际上在正确的时间请求pss数据 - 现在可以发送它   作为有序广播,没有接收者取消的能力   它

Checkin diff

答案 1 :(得分:1)

您可以尝试修改以下代码 在frameworks \ base \ services \ java \ com \ android \ server \ am \ ActivityManagerService.java(第1974行):

private ActivityManagerService() {
......      
     mBgBroadcastQueue = new BroadcastQueue(this, "background", BROADCAST_BG_TIMEOUT, true);
......
}

从:

mBgBroadcastQueue = new BroadcastQueue(this, "background", BROADCAST_BG_TIMEOUT, true);

为:

mBgBroadcastQueue = new BroadcastQueue(this, "background", BROADCAST_BG_TIMEOUT, false);

另一种解决方案是将ACTION_BOOT_COMPLETED意图设置为&#34; FLAG_RECEIVER_NO_ABORT&#34;在finishBooting(),ActivityManagerService.java:

final void finishBooting() { 
... 
Intent intent = new Intent(Intent.ACTION_BOOT_COMPLETED, null); 
intent.putExtra(Intent.EXTRA_USER_HANDLE, userId); 
intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT);
//add FLAG_RECEIVER_FOREGROUND to force the intent in foreground
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
......
}

答案 2 :(得分:0)

是的,我现在遇到这个问题。 BOOT_COMPLETED ordered = true,很多服务运行延迟了很长时间。 如果我删除所有GMS应用程序,那就没关系。因为太多GMS应用程序注册了BOOT_COMPLETED广播。

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context arg0, Intent arg1) {
        // TODO Auto-generated method stub

        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

这似乎是一个错误。如果我编写一个演示应用程序以接收上面的BOOT_COMPLETED,则会出现错误的问题。

我已经检查了@ hackbod的修改。除了修改从true到false的order之外,我什么都没有。 等待@hackbod的回复!