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);
但这恐怕对电池寿命不利。
现在我的问题是:
- 有人能告诉我 Android 设备与 AlarmsManager 一起工作的原因吗?
- 除了不会耗尽电池寿命并确保通知最多会在 2 或 3 小时后触发之外,您是否找到其他解决方案?
- 在这种特殊情况下,您有什么想法可以在不等待一两天来检测问题的情况下进行调试和代码测试吗?
提前致谢。
在 API 级别 23 之后,在 Android 系统上引入了打盹模式以减少电池消耗。通过下面 link:
我想每天在用户选择的特定时间触发通知,例如 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);
但这恐怕对电池寿命不利。
现在我的问题是:
- 有人能告诉我 Android 设备与 AlarmsManager 一起工作的原因吗?
- 除了不会耗尽电池寿命并确保通知最多会在 2 或 3 小时后触发之外,您是否找到其他解决方案?
- 在这种特殊情况下,您有什么想法可以在不等待一两天来检测问题的情况下进行调试和代码测试吗?
提前致谢。
在 API 级别 23 之后,在 Android 系统上引入了打盹模式以减少电池消耗。通过下面 link: