我有一个处理多个事件的广播接收器。我需要它在启动时为我做一些特殊的事情,所以我注册了android.intent.action.BOOT_COMPLETED
意图,这很好。如果设备已插入并正在充电,则android.intent.action.ACTION_POWER_CONNECTED
意图在BOOT_COMPLETED
之前被触发,并且在其应该执行操作之前工作。 (我使用BOOT_COMPLETED
作为一种初始化程序)。
有没有办法检查BOOT_COMPLETED
事件是否已被触发,以便我可以在事件过早被触发的情况下运行我的初始化代码?
答案 0 :(得分:0)
触发BOOT_COMPLETED
后,您需要在您的SharedPreferences 中设置一个标记为" true"。
所以,现在如果你的ACTION_POWER_CONNECTED
在BOOT_COMPLETED
之前被解雇,那么你需要检查SharedPreferences中的标志值。
如果该值仍为false,则表示BOOT_COMPLETED广播尚未触发,您不应执行操作。
注意 - 另请记住每次重置SharedPreferences中的标记。
答案 1 :(得分:0)
我找到了另一种一致的解决方案。 (我不能使用另一种方法,因为我不是那个悲伤地决定这种方法的人。)
使用这篇文章的答案:How to get Android system boot time我可以在SharedPreferences(或其他一些存储)中保存上次启动时间。一旦启动时间与最后一次不同,我知道它是一个新的启动,可以应用我的初始化等。
这是我写完的代码:
private boolean checkIfRebooted(Context context) {
SharedPreferences prefs = context.getSharedPreferences("package.name.class", Context.MODE_PRIVATE);
long savedUptime = prefs.getLong("timestamp", 0);
long currentUptime = System.currentTimeMillis() - SystemClock.elapsedRealtime();
// Giving it a threshold of 10ms since the calculation may be off by one sometimes.
if (Math.abs(currentUptime - savedUptime) < 10)
return false;
prefs.edit().putLong("timestamp", currentUptime).apply();
return true;
}
答案 2 :(得分:0)
您可以使用 /proc/sys/kernel/random/boot_id 中的内核引导 ID。 当代码收到 BOOT_COMPLETED 时,将 boot_id 存储在共享首选项中。之后就简单了。如果来自 /proc 的 boot_id 等于共享首选项,则 BOOT_COMPLETED 已被处理。否则,还没有。