1

这没有任何问题:

Intent mIntent = new Intent(getClass().getPackage().getName() + ".ALARM_TRIGGER");

PendingIntent pi = PendingIntent.getBroadcast(
                BackgroundService.getInstance(),
                mAlarmID,
                mIntent,
                PendingIntent.FLAG_UPDATE_CURRENT
        );

mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), interval, pi);

该代码有效。每次我们运行此代码时,它都会使用 ID (mAlarmID) 更新待处理的意图。

但是,如果手机处于深度睡眠状态,上述代码不会触发。所以我们必须使用 ELAPSED_REALTIME_WAKEUP。

    mAlarmManager.setRepeating(
            AlarmManager.ELAPSED_REALTIME_WAKEUP,
            SystemClock.elapsedRealtime() + startIn,
            interval,
            pi
    );

检查后adb shell dumpsys alarm,RTC_WAKEUP 总是找到并更新正确的待处理意图。然而,使用带有 ELAPSED_REALTIME_WAKEUP 的警报管理器,总是会创建新的待处理意图,无论 id 是什么。这意味着什么?

  • 在 #1 中,每次代码运行时,您总是会在 dumpsys 警报中找到一个警报。
  • 在 #2 中,每次代码运行时,您都会在 dumpsys 警报中找到 ONE MORE 警报。

这是错误吗?那么如何使用此代码,以便您始终拥有最多 1 个警报?

4

0 回答 0