在最新的Android版本中发送ACTION_BOOT_COMPLETED广播的方式似乎有一个非常重要的变化。 在JB 4.3中,并行处理了引导完成广播。与KK 4.4.2中的情况一样,它是连续处理的。 这是在启动后延迟服务的开始。
由于Google的这一变化,我的服务启动在启动完成后会延迟。 可以观察到设备变得迟缓并且用于触摸的音频不会播出。所有这些都是因为各自的服务起步较晚。
另外,从日志中我看到第一个在发出后接收ACTION_BOOT_COMPLETED的人在16-19秒之后收到它,而在JBP上,接收队列中的第一个人几乎不需要10毫秒得到它。
任何知道这一变化的人都可以解释为什么会这样做。 这将是一个很大的帮助。
非常感谢!
答案 0 :(得分:1)
改变是由@hackbod做出的,也许她可以说明原因。
她的签到说明:
完成问题#10779747:观察到日历存储崩溃......
...在设置中设置新用户时。
我们现在可以在有足够的后台服务时延迟广播 当前正在启动(对于svelte设备仍为1,对于正常设备为3 设备)。
添加新的意图标志以禁止接收者中止广播,其中 我用来修复初始BOOT_COMPLETED广播的问题 实际上在正确的时间请求pss数据 - 现在可以发送它 作为有序广播,没有接收者取消的能力 它
答案 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意图设置为" FLAG_RECEIVER_NO_ABORT"在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的回复!