警报服务未被触发

时间:2017-09-03 06:01:58

标签: android alarmmanager android-alarms

我想在特定时间以小时和分钟设置闹钟。

我试图这样做:

AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);

Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 11);
cal.set(Calendar.MINUTE, 30);

Intent intent = new Intent(this, AlarmService.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
alarm (AlarmManager.RTC_WAKEUP, calAlarm.getTimeInMillis(), pendingIntent);

但是在特定时刻和分钟不会发出警报。

我在stackoverflow和其他博客上看过很多例子,但这对我来说也没有用。

2 个答案:

答案 0 :(得分:0)

从Android 6.0(API级别23)开始,Android推出了Doze功能,可通过管理设备未连接电源时的应用行为来延长用户的电池续航时间。

Doze特别可能影响AlarmManager警报和计时器管理的活动,因为当系统处于Doze时,Android 5.1(API级别22)或更低级别的警报不会触发。

为了帮助安排警报,Android 6.0(API级别23)引入了两个新的AlarmManager方法:setAndAllowWhileIdle()和setExactAndAllowWhileIdle()。使用这些方法,您可以设置即使设备处于打盹状态也会触发的警报。

注意: setAndAllowWhileIdle()和setExactAndAllowWhileIdle()都不能每个应用每9分钟触发一次警报。

AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

Intent intent = new Intent(this, AlarmService.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

if (Build.VERSION.SDK_INT >= 23) {
    alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, alarmPeriodicTime, pendingIntent);

} else if (Build.VERSION.SDK_INT >= 19) {
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, alarmPeriodicTime, pendingIntent);

} else {
    alarmManager.set(AlarmManager.RTC_WAKEUP, alarmPeriodicTime, pendingIntent);
}

更多信息: https://developer.android.com/training/monitoring-device-state/doze-standby.html

答案 1 :(得分:0)

您可以使用:

AlarmManagerCompat.setAlarmClock(alarmManager, time, triggerIntent, showIntent)

您可以找到文档here