2013-10-12 32 views
-1

我正在研究我的學士論文並遇到問題。甚至在深度睡眠期間在Android上運行計劃任務的最佳方式是什麼?

我有什麼:

我寫的是應該從外部設備測量傳感器數據的應用程序。因此它應該運行很長一段時間。

在我的MainActivity中,用戶按下按鈕以啓動Service。在Service內部,它創建多個Timer s和TimerTask(每個傳感器一個)。我將它們存儲在兩個單獨的List s中。每個傳感器都有一個自己的時間段,表明應該多久調用一次。例如sensor1每10秒調用一次,sensor2每5分鐘調用一次。要做到這一點我打電話

timer.scheduleAtFixedRate(currentTask, 0, period); 

每個TimerTaskService得到啓動。

run()方法中,我調用傳感器並將其值和時間戳保存在應用程序的數據庫中。

的問題是什麼:

只要設備上,一切工作完全正常。但是一旦設備進入睡眠狀態,它真的開始變得奇怪了。

例如:我有一個傳感器計劃每10秒獲取一個值。我按下啓動鍵並保持設備開啓30秒。這樣我每10secs得到3個值。然後按下電源將其置於睡眠模式1分鐘並再次打開。我得到的是6個值(如預期的那樣),但時間戳不適合。在設備啓動的最後一次時間戳和第一次進入睡眠時間之間存在10秒以上的時間。接下來的幾個甚至具有相同的時間戳,這意味着run()方法在同一秒內被多次調用。當我打開設備時,每一次恢復正常並且工作正常。

這意味着在睡眠模式下某些功能無法正常工作。我想它必須TimerTaskTimer有關。

更多重要信息:

什麼可以排除(我猜):

  • 我調用系統時間(我甚至嘗試SystemClock.elapsedRealtime(),同樣的問題)
  • 的方式設備(我測試了我的Nexus 7(2013)和S3 Mini,兩者都失敗了,但是它在我的Nexus 4上工作,這意味着這個似乎沒有正常睡覺,但這是我猜想的另一個問題)
  • 外部傳感器(因爲我使用的是模擬,而不是意味着我創建隨機值,而不是調用真正的傳感器只是用於測試)

回答

0

我猜一定有事情做與TimerTask的和定時器。

更多的是,當CPU斷電時,代碼無法運行。

如果您的設備將始終插入電源你將永遠有一個UI在前臺,加android:keepScreenOn="true"一些小工具在用戶界面,保持開機屏幕和CPU。

如果您的設備將始終插入電源,請自行獲取WakeLock以使CPU保持開機狀態。這將需要WAKE_LOCK權限。這是而不是適用於生產應用程序的解決方案,但對於某些實驗室實驗(即,您不會在Play商店中銷售的產品),應該沒問題。

或者,如果設備將被插入電源,更換你的TimerTimerTaskServiceAlarmManager,並且:

這些將喚醒設備退出睡眠模式,讓您在讓設備再次進入睡眠狀態之前做一些工作。

然而,如果你連接到一些外部硬件真的打算,要記住,這種方法可能無法正常工作,因爲握手的設備重新連接到外部硬件當設備被喚醒了睡眠模式可能需要很長時間。在這種情況下,您確實需要確保設備始終有電,以便您可以採用WakeLock的方法。

+0

首先,感謝您的回答!我認爲'Service'是爲像我這樣的進程設計的。事情是,我已經在Play商店發佈了它。應用程序應該在後臺長期運行,並且前臺沒有任何UI。根據傳感器連接到設備的方式(USB或BT),存在或沒有連接到Android設備的外部電源。奇怪的是,它正在與我的Nexus 4(沒有任何MODS的股票版本4.3)一起工作。我想我沒有足夠的時間在截止日期結束之前解決這個問題。 – kaolick

+0

@kaolick:「我認爲服務是爲像我這樣的流程設計的」 - 「服務」不會讓設備保持清醒狀態。 – CommonsWare

+0

很高興知道! ;-)我實施了一點變通辦法。我在應用程序設置中添加了一個開關,以便用戶可以決定是否保持CPU喚醒(當然,默認爲OFF)。用戶也會被告知這可能會導致電池電量耗盡。我通過使用設置爲「PARTIAL_WAKE_LOCK」的喚醒鎖來實現此目的。我知道這不是最好的方式,但在特定的情況下,這對我來說是好的。完成論文後,我可以實施更好的解決方案。 – kaolick

相關問題