检查是否已在Android上触发BOOT_COMPLETED

时间:2017-02-27 15:59:41

标签: java android android-intent

我有一个处理多个事件的广播接收器。我需要它在启动时为我做一些特殊的事情,所以我注册了android.intent.action.BOOT_COMPLETED意图,这很好。如果设备已插入并正在充电,则android.intent.action.ACTION_POWER_CONNECTED意图在BOOT_COMPLETED之前被触发,并且在其应该执行操作之前工作。 (我使用BOOT_COMPLETED作为一种初始化程序)。

有没有办法检查BOOT_COMPLETED事件是否已被触发,以便我可以在事件过早被触发的情况下运行我的初始化代码?

3 个答案:

答案 0 :(得分:0)

触发BOOT_COMPLETED后,您需要在您的SharedPreferences 中设置一个标记为" true"。

所以,现在如果你的ACTION_POWER_CONNECTEDBOOT_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 已被处理。否则,还没有。