Запланированные задачи в службе переднего плана не выполняются по расписанию, когда приложение Android переходит в фоновый режим

У меня есть собственное приложение для реагирования, которое вызывает собственный модуль Android, который я написал. Этот собственный модуль запускает службу на переднем плане, показывая уведомление пользователю. Я сделал это, потому что хочу, чтобы моя служба работала, даже когда приложение переходит в фоновый режим или экран телефона выключен. В рамках моей службы я планирую 2 задачи, используя ScheduledExecutorService. Ниже приведен мой код из onStartCommand в моем классе обслуживания.

«runScanTask» должен запускаться в 0 секунд и запускаться каждые 13 секунд после этого. Планируется, что «stopScanTask» запустится через 8 секунд и будет запускаться каждые 13 секунд после этого. Это отлично работает, когда мой экран включен. Однако, когда я выключаю дисплей, задания либо перестают выполняться вообще, либо запускаются с совершенно случайными интервалами. Есть ли способ заставить их работать правильно, даже когда дисплей выключен?

final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

ScheduledFuture<?> startScanFuture = scheduler.scheduleAtFixedRate(runScanTask, 0, 13, TimeUnit.SECONDS);
ScheduledFuture<?> stopScanFuture = scheduler.scheduleAtFixedRate(stopScanTask, 8, 13, TimeUnit.SECONDS);

Runnable stopScanTask = new Runnable() {
   public void run() {
      Log.d("main", "STOP BLE SCAN");
   }
};

Runnable runScanTask = new Runnable() {
   public void run() {
      Log.d("main", "RUN BLE SCAN");
   }
};


person user1066568    schedule 12.05.2019    source источник


Ответы (1)


Когда ваш экран выключен, ваше устройство переходит в режим ожидания, а процессор ничего не делает. Выполните одно из следующих решений:

1- Приобретите частичную блокировку пробуждения в службе onCreate, но это плохо для батареи.

2- Используйте setAndAllowWhileIdle или setExactAndAllowWhileIdle . (минимальный период между задачами 9 минут при активной глубокой дремоте)

3- WorkManager (минимальный период между задачами 15 минут)

4- JobScheduler (минимальный период между задачами 15 минут)

5- библиотека Android-Job.

В этой статье описывается дилемма, с которой вы столкнулись.

person Wael Adel    schedule 04.07.2019