2012-09-18 161 views
6

我正在開發一個小型實用程序,掃描二維條碼,然後將每個條形碼提交給執行較長任務的IntentService。是否可以保存多個Wake Locks?

當顯示活動時,它應該防止設備進入休眠狀態,直到條形碼在服務中被處理。如果服務完成處理,它將自行停止,但活動仍應可見。

我想在活動生命週期中持有SCREEN_DIM_WAKE_LOCK WakeLock,但由於此類型不會阻止CPU進入睡眠狀態,因此在掃描新的2D代碼時,我還需要在活動中獲取PARTIAL_WAKE_LOCK ,並在處理後將其釋放到意向服務中。

SCREEN_DIM_WAKE_LOCK的目的是爲了避免用戶每隔幾秒鐘推動電源按鈕來喚醒設備並能夠讀取新的條形碼的不便。用戶必須一個接一個地閱讀大量的代碼,並且活動應該在沒有用戶交互的短時間間隔內進行。

我知道在Android中,由於我的應用程序無法控制的幾種情況,沒有100%保證應用程序處於最佳狀態,沒有關閉或未預先確定,但我希望儘可能地去。

所以有可能容納多個WakeLocks?他們可以在哪裏被宣佈同意活動和服務? (單例,擴展應用程序?)

回答

9

可以保存多個WakeLocks。事實上,當屏幕關閉時,多個應用程序同時同步時,它一直在進行。 (想象一下你的GMail和Facebook應用在屏幕鎖定的同時同步,他們不知道對方會有不同的WakeLocks。可能或不可能是不同類型的WakeLocks)

Android會確保每個人的期望得到滿足(換句話說,最大的電池消耗)。

在我看來,我認爲你過度思考你需要一個SCREEN_DIM_WAKE_LOCK的事實,因爲這可能會意外地耗盡很多電池,但我可能是錯的取決於你的用例。

所以簡短的答案是YES。您可以保持多個WakeLocks,Android將(應該)按預期行事。唯一需要記住的是你可以正確釋放Wakelocks。

在屏幕頂部出現問題時,我認爲您應該在您的活動進入暫停狀態時(當某種方式上的其他活動位於頂部或有意按下電源按鈕時)釋放您的活動的WakeLock。因爲在這一點上,用戶正在與另一個應用程序進行交互,您應該尊重它並讓它控制自己的行爲。在完成之前,您不必放棄服務中的部分喚醒鎖定。

希望這有助於。

+0

+1。但是我在'onStop'中釋放了屏幕WakeLock,因爲當我推送一個對話框時,我不想讓它睡覺。 –

+0

我認爲當前面有一個對話框時,你不再掃描條形碼,因爲用戶必須響應對話框,如果使用不響應及時對話? – Madushan

+0

是的,這一切都取決於睡眠計時器需要多長時間。如果需要3秒鐘,按下電源按鈕會很煩人。如果花費更長時間,我很好。根據工作負載的不同,我甚至可能會轉儲屏幕暗淡的鎖。 –

相關問題