簡體   English   中英

檢查 BOOT_COMPLETED 是否已經在 Android 上被觸發

[英]Check if BOOT_COMPLETED has been fired already on Android

我有一個處理多個事件的廣播接收器。 我需要它在啟動時為我做一些特殊的事情,所以我注冊了android.intent.action.BOOT_COMPLETED意圖,它工作正常。 如果設備已插入並正在充電,則android.intent.action.ACTION_POWER_CONNECTED意圖在BOOT_COMPLETED之前被觸發,並在它應該做的事情之前工作。 (我使用BOOT_COMPLETED作為一種初始化程序)。

有沒有辦法檢查BOOT_COMPLETED事件是否已被觸發,以便我可以在過早觸發某些事件時運行我的初始化代碼?

BOOT_COMPLETED被觸發時,您需要在 SharedPreferences 中將一個標志設置為“true”。

因此,現在如果您的ACTION_POWER_CONNECTEDBOOT_COMPLETED之前被觸發,那么您需要檢查 SharedPreferences 中標志的值。

如果該值仍然為 false,則表示 BOOT_COMPLETED 廣播尚未觸發,您不應執行您的操作。

注意 - 還要記住每次都重置 SharedPreferences 中的標志

我找到了另一個一致的解決方案。 (我不能使用另一種方法,因為我不是可悲地決定方法的人。)

使用這篇文章的答案: 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;
}

您可以使用 /proc/sys/kernel/random/boot_id 中的內核引導 ID。 當代碼收到 BOOT_COMPLETED 時,將 boot_id 存儲在共享首選項中。 之后就簡單了。 如果來自 /proc 的 boot_id 等於共享首選項,則 BOOT_COMPLETED 已被處理。 否則,還沒有。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM