我正在使用服务中的AlarmManager每分钟触发一次。
PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0,
getUpdateServiceIntent(mContext), PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
// Cancel any pending Intent
am.cancel(pendingIntent);
// Set a new one
am.set(AlarmManager.RTC_WAKEUP, 60000, pendingIntent);
在三星S5 Neo上: 当屏幕处于活动状态时,它正在按预期工作。 当屏幕关闭时,它每5分钟触发一次(而不是一次)。
我在S5 Mini(Android 4.4),Nexus 5 5.1和Nexus 5 6.0上尝试了完全相同的代码,这段代码运行正常。
targetSdkVersion是19。
任何想法如何在屏幕关闭时保持AlarmManager正常工作? 延迟仍然是5分钟,即使我要求30秒。
编辑: 我也试过了'setExact'方法,但它没有改变任何东西。每次报警之间的间隔时间仍为5分钟。
答案 0 :(得分:12)
您应该使用
AlarmManager#setExact(int type, long triggerAtMillis, PendingIntent operation)
而不是
AlarmManager#set(int type, long triggerAtMillis, PendingIntent operation))
来自谷歌:
AlarmManager#set(int type, long triggerAtMillis, PendingIntent operation))
注意:从API 19开始,传递给此方法的触发时间被视为不精确:警报将不会在此时间之前传递,但可能会延迟并在稍后传递。操作系统将使用此策略以便批量处理"在整个系统中一起报警,最大限度地减少设备需要“唤醒”的次数。并尽量减少电池使用。一般而言,只要将来安排的警报很长,就不会推迟在不久的将来安排的警报。
编辑:
我正在使用的警报应用程序:
清单:
<uses-permission android:name="android.permission.WAKE_LOCK"/>
Java代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(nextAlarm.getTimeInMillis(), pendingIntent);
alarmManager.setAlarmClock(alarmClockInfo, pendingIntent);
}else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(android.app.AlarmManager.RTC_WAKEUP, nextAlarm.getTimeInMillis(), pendingIntent);
}else {
alarmManager.set(android.app.AlarmManager.RTC_WAKEUP, nextAlarm.getTimeInMillis(), pendingIntent);
}