Сервис 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
надеется, что это поможет