AlarmsManager会在需要时触发

时间:2017-05-15 11:05:55

标签: android notifications android-alarms

我希望每天在用户选择的特定时间触发通知,例如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点触发通知? 我知道系统不会在我想要的特定时间触发通知,这没关系。但是在这里我们谈论大约18个小时。

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

我可以切换这一行:

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

到另一行代码:

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

但这对于我害怕的电池续航时间并不好。

现在我的问题:

  • 有人可以告诉我Android设备与AlarmsManager协同工作的原因吗?
  • 您是否找到了另一种解决方案,而不是不会耗尽电池寿命,并确保通知最多会在2或3小时后触发?
  • 在这种特殊情况下,您是否有任何想法可以调试和执行代码测试而无需等待一两天来检测问题?

提前致谢。

1 个答案:

答案 0 :(得分:1)

在API级别23之后,Android系统上引入了打盹模式以减少电池消耗。通过以下链接,我认为这将有助于你。

How to make Alarm Manager work when Android 6.0 in Doze mode?