我正在开发一个报警应用程序。用户可以在应用程序中设置报警,并且当其中一个报警触发时必须进行一些操作。我使用了第一个报警管理器设置方法。但是只有第一个报警器在正确的时间内工作,其他的报警器在延迟近5分钟后才触发。其他的警报在延迟了近5分钟后才触发。
Intent intent = new Intent(applicationContext, OneShotAlarm.class);
PendingIntent sender = PendingIntent.getBroadcast(applicationContext, 0,
intent, FLAG_ONE_SHOT);
AlarmManager alarmManager = (AlarmManager) applicationContext.getSystemService(ALARM_SERVICE);
alarmManager.cancel(sender);
alarmManager.set(AlarmManager.RTC_WAKEUP, alarmCalendar.getTimeInMillis(), sender);
后来,我发现 这个. 我把设置方法改成了设置精确方法,所有的报警看起来都很完美。
alarmManager.setExact(AlarmManager.RTC_WAKEUP, alarmCalendar.getTimeInMillis(), sender);
但我看到有时还是会延迟触发。大概5-8分钟。
我的错误在哪里?
更新。
当我第一次检测到这个错误时,我保留了日志文件。我在日志文件中看到了延迟时间。一些预设方法的日志,如下面。
16: 30: 59 下一个警报设置为24052020 16: 35: 00.
16:35:00 触发报警
16:35:00 通知发送
16:35:00 下一次报警设置为24052020 16:40:00
16:44:47 触发报警
16:44:47 通知发送
16:44:47 下一个报警设置为24052020 16:50:00
16:54:48 触发报警
16:54:48 通知发送
16:54:48 下次报警设置为24052020 18:00:00
还有一些设置后的方法日志,如下面。
03:00:00 触发报警
03:00:00 通知发送
03:00:00 下一次报警设置为25052020 07:00:00
07:08:14 触发报警
07:08:15 通知发送
07:08:15 下一次报警设置为25052020 08:30:00
08:34:47 触发报警
08:34:47 下一个报警设置为 25052020 09:00:00
09:00:00 触发报警
09:00:00 下一次报警设置为25052020 18:00:00
更新:我的报警设置代码在方法里面。我的报警设置代码是在一个方法里面的。我在每次数据更新或触发报警后都会调用它。这样,我就可以确保总是可以设置下一个报警。
对于目前的Android版本,你应该在onReceive中再次调用报警管理器。这是报警管理器的例子,每5秒调用一次。
public class TestApplication extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
static void createAlarm() {
Intent intent = new Intent(context, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, REQUEST_CODE, intent, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pendingIntent);
}
}
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Alarm Manager Test", Toast.LENGTH_SHORT).show();
TestApplication.createAlarm();
}
}