Тревога в Android прекращается, когда прошло несколько часов
Я делаю приложение, которое должно выполнять некоторые задачи регулярно, обычно от 1 до 5 минут.
я пытался .setRepeating
, setInexactRepeating
а также .set
(последний сбрасывает будильник, когда задание выполнено)
Когда срабатывает сигнализация, сервис запускается.
Обычно это работает хорошо, но иногда сигнал тревоги перестает срабатывать, независимо от того, какой метод я использую.
Я тестировал в Android 5.1 и 4.4.2.
Почему это происходит? Это известная ошибка или что-то?
Вот метод, который я использую для установки будильника, закомментированный код - другой метод, который я попробовал:
public void setAlarm(Context context) {
alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
/*alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis() + 1000,
PreferenceHelper.readLong(PreferenceHelper.PREF_TIME_TO_REFRESH), alarmIntent);*/
alarmMgr.set(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis() + PreferenceHelper.readLong(PreferenceHelper.PREF_TIME_TO_REFRESH), alarmIntent);
ComponentName receiver = new ComponentName(context, BootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
Как я уже говорил, если я использую .set
Я снова вызываю метод, когда служба завершает назначенную задачу. (Это тоже работает, но опять через несколько часов снова срабатывает сигнализация).
public class AlarmReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, WifiCheckerService.class);
startWakefulService(context, service);
}
2 ответа
У меня фактически была та же самая проблема, и я вместо этого хотел перейти на SyncAdapter, но у меня были другие проблемы с этим. Так что не предполагая, что это решит вашу проблему.
Проблема вовсе не в диспетчере аварий. Мое приложение предназначено для API > 23 и тестирует с телефоном API 24 и все еще получает эту проблему. Проблема заключается в том, что некоторые производители создают свой собственный Диспетчер приложений поверх Android, и это убивает ваше приложение по причинам ресурса / батареи, что останавливает ваше приложение и все связанные с ним сигналы тревоги.
Проверьте этот пост, чтобы проверить, находится ли приложение в режиме остановки. Android AlarmManager останавливается, когда активность умирает
Я заметил, что на некоторых телефонах это не происходит, а на некоторых телефонах это происходит...
Если это не так, и вы узнаете, что на самом деле не так, пожалуйста, дайте мне знать, так как адаптеры синхронизации убивают меня....
Как правило, несмотря на то, что вы запускаете свое приложение на устройствах с API < 23, в качестве цели API 23 вы должны использовать setExactAndAllowWhileIdle
вместо set
,
Что вы описываете: alarm suddenly stops firing after a few hours
Похоже, что произойдет в М-устройстве. Интересно, принудительно ли такое поведение также преднамеренно применяется в устройствах до M при настройке API 23... Мне нужно посмотреть на исходный код Android, чтобы получить ответ на этот вопрос.