我正在研究我的學士論文並遇到問題。甚至在深度睡眠期間在Android上運行計劃任務的最佳方式是什麼?
我有什麼:
我寫的是應該從外部設備測量傳感器數據的應用程序。因此它應該運行很長一段時間。
在我的MainActivity
中,用戶按下按鈕以啓動Service
。在Service
內部,它創建多個Timer
s和TimerTask
(每個傳感器一個)。我將它們存儲在兩個單獨的List
s中。每個傳感器都有一個自己的時間段,表明應該多久調用一次。例如sensor1每10秒調用一次,sensor2每5分鐘調用一次。要做到這一點我打電話
timer.scheduleAtFixedRate(currentTask, 0, period);
每個TimerTask
當Service
得到啓動。
在run()
方法中,我調用傳感器並將其值和時間戳保存在應用程序的數據庫中。
的問題是什麼:
只要設備上,一切工作完全正常。但是一旦設備進入睡眠狀態,它真的開始變得奇怪了。
例如:我有一個傳感器計劃每10秒獲取一個值。我按下啓動鍵並保持設備開啓30秒。這樣我每10secs得到3個值。然後按下電源將其置於睡眠模式1分鐘並再次打開。我得到的是6個值(如預期的那樣),但時間戳不適合。在設備啓動的最後一次時間戳和第一次進入睡眠時間之間存在10秒以上的時間。接下來的幾個甚至具有相同的時間戳,這意味着run()
方法在同一秒內被多次調用。當我打開設備時,每一次恢復正常並且工作正常。
這意味着在睡眠模式下某些功能無法正常工作。我想它必須與TimerTask
和Timer
有關。
更多重要信息:
什麼可以排除(我猜):
- 我調用系統時間(我甚至嘗試
SystemClock.elapsedRealtime()
,同樣的問題) - 的方式設備(我測試了我的Nexus 7(2013)和S3 Mini,兩者都失敗了,但是它在我的Nexus 4上工作,這意味着這個似乎沒有正常睡覺,但這是我猜想的另一個問題) 個
- 外部傳感器(因爲我使用的是模擬,而不是意味着我創建隨機值,而不是調用真正的傳感器只是用於測試)
首先,感謝您的回答!我認爲'Service'是爲像我這樣的進程設計的。事情是,我已經在Play商店發佈了它。應用程序應該在後臺長期運行,並且前臺沒有任何UI。根據傳感器連接到設備的方式(USB或BT),存在或沒有連接到Android設備的外部電源。奇怪的是,它正在與我的Nexus 4(沒有任何MODS的股票版本4.3)一起工作。我想我沒有足夠的時間在截止日期結束之前解決這個問題。 – kaolick
@kaolick:「我認爲服務是爲像我這樣的流程設計的」 - 「服務」不會讓設備保持清醒狀態。 – CommonsWare
很高興知道! ;-)我實施了一點變通辦法。我在應用程序設置中添加了一個開關,以便用戶可以決定是否保持CPU喚醒(當然,默認爲OFF)。用戶也會被告知這可能會導致電池電量耗盡。我通過使用設置爲「PARTIAL_WAKE_LOCK」的喚醒鎖來實現此目的。我知道這不是最好的方式,但在特定的情況下,這對我來說是好的。完成論文後,我可以實施更好的解決方案。 – kaolick