AlarmsManager 随时触发

AlarmsManager triggers whenever it wants

我想每天在用户选择的特定时间触发通知,例如 6' / 7' / 8'。

为此,我创建了一个 WakefulBroadcastReceiver,它传递给 IntentService 以创建通知。

这就是我设置 AlarmsManager 的方式。 timeInHours 是作为参数传递的整数,介于 6 和 12 之间:

    Intent i = new Intent(context, StepCountNotifyBroadcast.class);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);

    // Get the next day at timeInHours hours'.
    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date()); // compute start of the day for the timestamp
    cal.set(Calendar.HOUR_OF_DAY, timeInHours);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    cal.set(Calendar.AM_PM, Calendar.AM);

    if (new Date().getTime() > cal.getTime().getTime())
        cal.add(Calendar.DAY_OF_YEAR, 1);

    long nextDay = cal.getTime().getTime();

    // Setup the alarm.
    long timeBetween = AlarmManager.INTERVAL_DAY;      // Each day.
    AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarms.cancel(pi);
    alarms.setRepeating(AlarmManager.RTC_WAKEUP, nextDay, timeBetween, pi);

    Date nextDayAsDate = new Date(nextDay);
    GLog.d("AlarmUtils", "scheduleNotifiation for next date: " + nextDayAsDate.toString());

它在 50% 的时间里运行良好,但仍然会做一些疯狂的事情,例如...在 2:00 上午触发通知?! 我知道系统不会在我想要的特定时间触发通知,这没关系。不过这里我们说的是大约18小时后。

在日志中,似乎我的 IntentService 代码在某些情况下 运行 在半夜有效。所以这不是通知本身的问题。

我可以切换这条线:

    alarms.setRepeating(AlarmManager.RTC_WAKEUP, nextDay, timeBetween, pi);

到另一行代码:

    alarms.setExact(AlarmManager.RTC_WAKEUP, nextDay, pi);

但这恐怕对电池寿命不利。

现在我的问题是:

提前致谢。

在 API 级别 23 之后,在 Android 系统上引入了打盹模式以减少电池消耗。通过下面 link: