Тревога в 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, чтобы получить ответ на этот вопрос.

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