我需要定期在後臺運行任務並保持喚醒CPU。根據Android documentation我爲此使用了PARTIAL_WAKE_LOCK。 爲了測試喚醒鎖,我寫了一個Service,它每2分鐘啓動一個線程,使用ScheduledThreadPoolExecutor。這個線程只是在sdcard的日誌文件中寫一個字符串。使用PARTIAL_WAKE_LOCK保持活動後臺線程
然後,我執行了下面的簡單測試:運行應用程序並從電源拔下設備。正確執行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!");
}
我想到的是,當顯示器關閉時,還執行的線程,但看我的日誌文件似乎並非如此。我錯在哪裏?
您正在測試的Android版本以及具體的硬件? Android 6.0引入了打盹模式,各種製造商都有自己的積極節能模式,預先打盹。除非用戶將您的應用程序添加到電池優化白名單中,否則每兩分鐘執行一次(使用'ScheduledExecutorService','AlarmManager','JobScheduler'等等)將無法在現代Android設備上執行。 – CommonsWare
我使用的是Nexus 5(Android 6.0.1)和Nexus 6(Android 7)。是否有可能避免打盹模式? –
@CommonsWare這是否適用於創建類似'new MyThread()。start()'的工作線程?我閱讀了Android開發者指南,但它只談到了AlarmManager和網絡相關的工作。它剛剛提到了'推遲後臺CPU'一次,並沒有任何解釋。 – Jenix