我希望每天在用户选择的特定时间触发通知,例如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);
但这对于我害怕的电池续航时间并不好。
现在我的问题:
提前致谢。
答案 0 :(得分:1)
在API级别23之后,Android系统上引入了打盹模式以减少电池消耗。通过以下链接,我认为这将有助于你。
How to make Alarm Manager work when Android 6.0 in Doze mode?