2016-12-14 67 views
0

我需要定期在後臺運行任務並保持喚醒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!"); 
} 

我想到的是,當顯示器關閉時,還執行的線程,但看我的日誌文件似乎並非如此。我錯在哪裏?

+0

您正在測試的Android版本以及具體的硬件? Android 6.0引入了打盹模式,各種製造商都有自己的積極節能模式,預先打盹。除非用戶將您的應用程序添加到電池優化白名單中,否則每兩分鐘執行一次(使用'ScheduledExecutorService','AlarmManager','JobScheduler'等等)將無法在現代Android設備上執行。 – CommonsWare

+0

我使用的是Nexus 5(Android 6.0.1)和Nexus 6(Android 7)。是否有可能避免打盹模式? –

+0

@CommonsWare這是否適用於創建類似'new MyThread()。start()'的工作線程?我閱讀了Android開發者指南,但它只談到了AlarmManager和網絡相關的工作。它剛剛提到了'推遲後臺CPU'一次,並沒有任何解釋。 – Jenix

回答

2

在Android 6.0+,Doze mode基本上會撤消你的喚醒鎖定。某些製造商的6.0以前版本的設備也有類似的功能。

是否可以避開打盹模式?

用戶可以將您的應用程序添加到電池優化白名單。請注意,要求用戶通過ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSmay result in your app being banned from the Play Store這樣做,如果這是您的分銷渠道之一。

或者,用戶可以始終將他們的設備保持在充電器上。

如果您可以通過不太頻繁的投票期間,您可以嘗試setAndAllowWhileIdle()setExactAndAllowWhileIdle()AlarmManager。充其量,你將每9分鐘控制一次。不過,您可能無法訪問互聯網。

否則,設備端輪詢每N分鐘方法註定要失敗。

谷歌希望您使用GCM/FCM並避免輪詢,只要您的服務器在需要時按下信息即可。我不知道這與你的用例是否相關。

+0

非常感謝@CommonsWare。 是的,這個信息對我的情況非常有用。 我的目標是能夠定期在後臺執行P2P對等發現,以便在附近找到新設備。通過AlarmManager(每9分鐘)我可以使用WifiP2P框架嗎? –

+0

@MattiaCampana:我還沒有玩過WifiP2P。但是,除非您還持有'WifiLock',否則我預計WiFi在Doze期間將無法使用,並且在Doze期間我無法確定WifiLock是否足以保持此狀態。 WifiLock和Doze之間的交互是未記錄的AFAIK。 – CommonsWare

+0

@CommonsWare哦,還有一件事!仍然不確定WifiLock? – Jenix

相關問題