Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在KITKAT 4.4.2中连续处理引导完成广播<;操作_引导_完成>&书信电报;ActivityManagerService.java>;_Android_Performance_Initialization_Broadcastreceiver_Boot - Fatal编程技术网

Android 在KITKAT 4.4.2中连续处理引导完成广播<;操作_引导_完成>&书信电报;ActivityManagerService.java>;

Android 在KITKAT 4.4.2中连续处理引导完成广播<;操作_引导_完成>&书信电报;ActivityManagerService.java>;,android,performance,initialization,broadcastreceiver,boot,Android,Performance,Initialization,Broadcastreceiver,Boot,在最新的安卓版本中,动作启动完成广播的发送方式似乎发生了非常重要的变化。 在JB 4.3中,引导完成广播是并行处理的。其中,如KK 4.4.2所示,其被连续处理。 这会延迟启动后服务的启动 由于谷歌的这一改变,我的服务启动在启动完成后被延迟。 人们可以观察到设备变得迟钝,触摸音频无法播放。所有这些都是因为各自的服务启动较晚 此外,从日志中我看到,在发送操作\u BOOT\u完成后,第一个接收操作\u BOOT\u的人在16-19秒后接收操作,而在JBP上,接收队列中的第一个人几乎不需要10毫

在最新的安卓版本中,动作启动完成广播的发送方式似乎发生了非常重要的变化。 在JB 4.3中,引导完成广播是并行处理的。其中,如KK 4.4.2所示,其被连续处理。 这会延迟启动后服务的启动

由于谷歌的这一改变,我的服务启动在启动完成后被延迟。 人们可以观察到设备变得迟钝,触摸音频无法播放。所有这些都是因为各自的服务启动较晚

此外,从日志中我看到,在发送操作\u BOOT\u完成后,第一个接收操作\u BOOT\u的人在16-19秒后接收操作,而在JBP上,接收队列中的第一个人几乎不需要10毫秒就可以获得操作

任何知道这一变化的人都可以解释这一变化的原因吗。 这将是一个很大的帮助


非常感谢

这个变化是@hackbod做的,也许她可以解释一下原因

她的登记单上写着:

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

…从“设置”设置新用户时

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

添加新的意图标志以不允许接收器中止广播,这 我用于修复初始引导未完成的问题 实际上在正确的时间请求pss数据——现在可以发送了 作为一种有序的广播,而不允许接收者取消 它


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

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();
        }
    }
}
这似乎是一只虫子。因为如果我编写一个演示应用程序来接收如上所述完成的引导,错误的问题将再次出现

我已经检查了@hackbod的修改。除了修改从真到假的顺序,我没有任何想法。
等待@hackbod的回复

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

发件人:

致:

另一个解决方案是在finishBooting()的ActivityManagerService.java中,将动作\u BOOT\u COMPLETED intent设置为“FLAG\u RECEIVER\u NO\u ABORT”:

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);
......
}

由于没有人知道这一变化的原因及其影响,安卓问题跟踪系统已经报告了这一问题。链接-希望得到答案。谢谢
mBgBroadcastQueue = new BroadcastQueue(this, "background", BROADCAST_BG_TIMEOUT, true);
mBgBroadcastQueue = new BroadcastQueue(this, "background", BROADCAST_BG_TIMEOUT, false);
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);
......
}