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

Android AlarmManager 驗證鬧鐘是否啟動:PendingIntent 唯一標識與 FLAG_NO_CREATE 技巧

     編輯:程式設計綜合問答

需求:應用啟動時檢查之前設置的鬧鐘是否仍在系統中處於啟動狀態,若無則重新設置。

核心機制:PendingIntent 唯一性 = 鬧鐘唯一性

鬧鐘由 PendingIntent 標識,**相同 requestCode + action + data 的 PendingIntent 視為同一鬧鐘**。

檢查鬧鐘是否存在

public boolean isAlarmActive(Context context, String action, int requestCode) {
    Intent intent = new Intent(action);
    // FLAG_NO_CREATE:若不存在則返回 null,不創建新對象
    PendingIntent pi = PendingIntent.getBroadcast(context, requestCode, intent, 
        PendingIntent.FLAG_NO_CREATE | PendingIntent.FLAG_IMMUTABLE);
    return pi != null;
}

設置/更新鬧鐘(冪等)

public void setAlarm(Context context, String action, int requestCode, long triggerAtMillis) {
    Intent intent = new Intent(action);
    // FLAG_UPDATE_CURRENT:若存在則更新 Intent 內容(如 extras)
    PendingIntent pi = PendingIntent.getBroadcast(context, requestCode, intent,
        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
    
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerAtMillis, pi);
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        am.setExact(AlarmManager.RTC_WAKEUP, triggerAtMillis, pi);
    } else {
        am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis, pi);
    }
}

完整啟動檢查邏輯

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    String action = "com.vit.upload";
    int requestCode = 12345; // 固定唯一值
    long nextTrigger = System.currentTimeMillis() + 30 * 60 * 1000; // 30 分鐘後
    
    if (!isAlarmActive(this, action, requestCode)) {
        setAlarm(this, action, requestCode, nextTrigger);
        Log.d("Alarm", "Alarm not active, reset.");
    } else {
        Log.d("Alarm", "Alarm already active.");
    }
}

關鍵點總結

  • requestCode 必須固定:作為鬧鐘 ID,不可隨機生成。
  • FLAG_NO_CREATE 專門用於「檢查存在性」,不產生副作用。
  • FLAG_UPDATE_CURRENT 允許更新觸發時間/數據而不創建新鬧鐘。
  • Android 6+ Doze 模式下需用 setExactAndAllowWhileIdle 確保準時喚醒。
  • 鬧鐘在重啟後失效,需在 BOOT_COMPLETED 接收器中恢復。

掌握 PendingIntent 唯一性原理,精準控制鬧鐘生命周期。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved