Мне нужно периодически запускать задачу в фоновом режиме и не выключать процессор. Согласно документации для Android, я использовал PARTIAL_WAKE_LOCK strong> для этой цели. Чтобы протестировать блокировку пробуждения, я написал службу, которая запускает поток каждые 2 минуты, используя ScheduledThreadPoolExecutor. Этот поток просто записывает строку в файл журнала на SD-карте.
Затем я выполнил следующий простой тест: запустил приложение и отключил устройство от питания. Через 2 или 3 часа правильного выполнения Служба прекращает выполнение потока, и в файл журнала не записываются новые строки.
Код услуги:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "Service onStartCommand");
PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "WiOpp wakeLock");
wakeLock.acquire();
TestTask testTask = new TestTask(getApplicationContext());
ScheduledThreadPoolExecutor monitorPool = new ScheduledThreadPoolExecutor(1);
monitorPool.scheduleAtFixedRate(testTask, 0, 120, TimeUnit.SECONDS);
return START_STICKY;
}
Код TestTask:
@Override
public void run() {
//write on log file
LogManager.getInstance().logData("I am running!");
}
Я ожидаю, что поток также выполняется, когда дисплей выключен, но, глядя на мой файл журнала, это не так. Где я не прав?
ScheduledExecutorService
,AlarmManager
,JobScheduler
и т. д.) на современных устройствах Android будет невозможно, если только пользователь не добавит ваше приложение в белый список оптимизации батареи. - person CommonsWare   schedule 15.12.2016