首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android AlarmManager 設定鬧鐘後應用被清理導致 BroadcastReceiver 不觸發的對策

     編輯:程式設計綜合問答

現象

靜態註冊 BroadcastReceiver + AlarmManager.setExact,App 被工作管理器/清理大師殺掉後,鬧鐘時間到不觸發。

原因

  • Android 6.0+ Doze 模式、App Standby 會延遲/批次執行鬧鐘。
  • 第三方清理工具會取消 PendingIntent、清除 AlarmManager 設定。
  • 進程死亡導致靜態廣播接收器所在進程不存在,系統無法投遞。

解決方案

  1. 使用 setExactAndAllowWhileIdle / setAlarmClock(API 19+/21+)提高優先級。
  2. 在 BootCompletedReceiver 中重新註冊所有鬧鐘,確保重啟後恢復。
  3. 引導使用者將 App 加入「電池優化白名單」、「自啟動管理允許」。
  4. 關鍵業務改用 WorkManager(周期性)或 FCM 高優先級訊息 喚醒。

代碼片段


AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent intent = new Intent(this, MyReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_IMMUTABLE);
if (Build.VERSION.SDK_INT >= 23) {
    am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerTime, pi);
} else if (Build.VERSION.SDK_INT >= 19) {
    am.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pi);
} else {
    am.set(AlarmManager.RTC_WAKEUP, triggerTime, pi);
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved