Сервис Android, запланированный с AlarmManager, перестает вызываться через пару дней

Я пытался запланировать запуск службы Android повторно с использованием класса AlarmManager, но через несколько дней служба перестает вызываться. Первоначально я использовал приведенный ниже код, чтобы попытаться достичь этого:

Intent alarmIntent = new Intent(currentActivity.getApplicationContext(), AlarmReceiver.class);
PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(currentActivity.getApplicationContext(),
            AppManager.ALARM_PENDING_INTENT_REQUEST_CODE,
            alarmIntent,
            PendingIntent.FLAG_CANCEL_CURRENT);

AlarmManager alarmManager = (AlarmManager)currentActivity.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
            System.currentTimeMillis(),
            interval,
            pendingAlarmIntent);

с получателем:

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context _context, Intent _intent){
        Intent serviceIntent = new Intent(_context.getApplicationContext(), PostLocationService.class);
        _context.getApplicationContext().startService(serviceIntent);
    }
}

Это работало в течение нескольких дней, а затем внезапно прекратилось. Поэтому я изменил код для первоначальной трансляции на приемник один раз, а затем повторно транслировал на приемник каждый раз, когда служба запускается. Я сделал это с помощью следующего кода:

Intent alarmIntent = new Intent(currentActivity.getApplicationContext(),     AlarmReceiver.class);
PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(currentActivity.getApplicationContext(),
            AppManager.ALARM_PENDING_INTENT_REQUEST_CODE,
            alarmIntent,
            PendingIntent.FLAG_CANCEL_CURRENT);

AlarmManager alarmManager = (AlarmManager)currentActivity.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP,
            interval,
            pendingAlarmIntent);

К сожалению, это имеет тот же результат; Сервис перестает выполняться через пару дней.

Я также зарегистрировал приемник, когда устройство загружается, чтобы повторно инициировать вызов AlarmManager, который имеет тот же код, что и выше.

Я что-то пропустил? Есть ли лучший подход, чем любой из вышеперечисленных методов для этого типа постоянного повторного выполнения?

1 ответ

По словам разработчика сайта:

Примечание. Начиная с API 19 (KITKAT), выдача аварийных сигналов является неточной: ОС будет сдвигать аварийные сигналы, чтобы минимизировать пробуждения и использование батареи. Существуют новые API для поддержки приложений, которые требуют строгих гарантий доставки; см. setWindow(int, long, long, PendingIntent) и setExact(int, long, PendingIntent). Приложения, у которых targetSdkVersion более ранний, чем API 19, будут по-прежнему видеть предыдущее поведение, при котором все тревоги доставляются точно по запросу Blockquote

узнать больше

надеется, что это поможет

Другие вопросы по тегам