[英]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_CONNECTED
在BOOT_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.