Android Java - 报警管理器大部分工作完美,但有时会延迟

问题描述 投票:0回答:1

我正在开发一个报警应用程序。用户可以在应用程序中设置报警,并且当其中一个报警触发时必须进行一些操作。我使用了第一个报警管理器设置方法。但是只有第一个报警器在正确的时间内工作,其他的报警器在延迟近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

更新:我的报警设置代码在方法里面。我的报警设置代码是在一个方法里面的。我在每次数据更新或触发报警后都会调用它。这样,我就可以确保总是可以设置下一个报警。

java android calendar broadcastreceiver alarmmanager
1个回答
0
投票

对于目前的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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.