使用WakeLock使Android應用程式保持後臺喚醒
在使用一些產品列如微信、QQ之類的,如果有新訊息來時,手機螢幕即使在鎖屏狀態下也會亮起並提示聲音,這時使用者就知道有新訊息來臨了。但是,一般情況下手機鎖屏後,Android系統為了省電以及減少CPU消耗,在一段時間後會使系統進入休眠狀態,這時,Android系統中CPU會保持在一個相對較低的功耗狀態。針對前面的例子,收到新訊息必定有網路請求,而網路請求是消耗CPU的操作,那麼如何在鎖屏狀態乃至系統進入休眠後,仍然保持系統的網路狀態以及通過程式喚醒手機呢?答案就是Android中的WakeLock機制。
首先看看官方的解釋:
PowerManager:This class gives you control of the power state of the device.
PowerManager.WakeLock: lets you say that you need to have the device on.
PowerManager負責對Android裝置電源相關進行管理,而系統通過各種鎖對電源進行控制,WakeLock是一種鎖機制,只要有人拿著這把所,系統就無法進入休眠階段。既然要保持應用程式一直在後臺執行,那自然要獲得這把鎖才可以保證程式始終在後臺執行。之前我做過一個需求是要在後臺跑一個Service執行輪詢,但發現一段時間以後,輪詢就中斷了(我測試是二十分鐘後請求停止),但重新解鎖螢幕後,輪詢請求又開始了,後來在Stackoverflow上找到的WakeLock的用法,試了一下,還挺管用。在使用這個方法之前,我把Service置成前臺Service等方法都不奏效,不知在這個需求上大家是否還有更好的辦法,大家可以留言和我討論!
接下來看如何使用WakeLock:
- WakeLock wakeLock = null;
- //獲取電源鎖,保持該服務在螢幕熄滅時仍然獲取CPU時,保持執行
- private void acquireWakeLock()
- {
- if (null == wakeLock)
- {
- PowerManager pm = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
- wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE, "PostLocationService");
- if (null != wakeLock)
- {
- wakeLock.acquire();
- }
- }
- }
- //釋放裝置電源鎖
- private void releaseWakeLock()
- {
- if (null != wakeLock)
- {
- wakeLock.release();
- wakeLock = null;
- }
- }
上面第一個方法是獲取鎖,第二個方法是釋放鎖,一旦獲取鎖後,及時螢幕在熄滅或鎖屏長時間後,系統後臺一直可以保持獲取到鎖的應用程式執行。獲取到PowerManager的例項pm後,再通過newWakeLock方法獲取wakelock的例項,其中第一個引數是指定要獲取哪種型別的鎖,不同的鎖對系統CPU、螢幕和鍵盤有不同的影響,第二個引數是自定義名稱。
PARTIAL_WAKE_LOCK:保持CPU 運轉,螢幕和鍵盤燈有可能是關閉的。
SCREEN_DIM_WAKE_LOCK:保持CPU 運轉,允許保持螢幕顯示但有可能是灰的,允許關閉鍵盤燈
SCREEN_BRIGHT_WAKE_LOCK:保持CPU 運轉,允許保持螢幕高亮顯示,允許關閉鍵盤燈
FULL_WAKE_LOCK:保持CPU 運轉,保持螢幕高亮顯示,鍵盤燈也保持亮度
ACQUIRE_CAUSES_WAKEUP:強制使螢幕亮起,這種鎖主要針對一些必須通知使用者的操作.
ON_AFTER_RELEASE:當鎖被釋放時,保持螢幕亮起一段時間
最後別忘了宣告許可權:
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.DEVICE_POWER"/>
以上就針對提出的一個需求總結了一個方法,有更好方法的朋友希望在留言處提出,共同討論改進之處,謝謝!
需求:要在後臺跑一個Service執行輪詢,螢幕熄滅或鎖屏後,仍然需要保持Service一直處於輪詢狀態。
覺得文章對你有用,點選右下角的轉發按鈕分享給更多人!
同時歡迎關注我的新浪微博和我交流:@唐韌_Ryan
相關文章
- android 喚醒螢幕Android
- 使用 Wake Lock API:保持裝置喚醒的最佳實踐API
- android保持服務不休眠(持續執行)以及喚醒螢幕的方法Android
- 併發程式設計喚醒判斷用while程式設計While
- 虛假喚醒
- win7休眠後不能喚醒怎麼辦_win7系統休眠後無法喚醒如何解決Win7
- 電腦休眠後無法喚醒怎麼辦?win10電腦休眠後無法喚醒的解決辦法Win10
- .NET 網路喚醒
- Android按下返回鍵,將應用退到後臺Android
- Android 外部喚起應用跳轉指定頁面Android
- 語音喚醒實現
- 如何使用藍芽裝置喚醒您的Mac藍芽Mac
- win10睡眠無法喚醒怎麼解決_win10電腦睡眠後無法喚醒的解決教程Win10
- 大神教你設定Linux程式的睡眠和喚醒Linux
- win10如何關閉滑鼠喚醒_win10關閉滑鼠喚醒方法Win10
- win10睡眠模式怎麼喚醒_win10睡眠按啥鍵喚醒Win10模式
- win10 滑鼠喚起開機怎麼設定 win10臺式電腦休眠後如何滑鼠鍵盤喚醒Win10
- HTML5如何喚醒APP?HTMLAPP
- 同步篇——事件等待與喚醒事件
- win10待機後無法喚醒固態硬碟怎麼解決_win10待機後固態硬碟喚醒不了的解決方案Win10硬碟
- win10遠端wol喚醒如何使用_win10系統開啟wol網路喚醒遠端功能教程Win10
- win10睡眠按什麼鍵喚醒_w10系統睡眠怎樣喚醒Win10
- win10如何關閉自動喚醒_win10關閉自動喚醒方法Win10
- win10怎麼禁用滑鼠喚醒_win10如何關閉滑鼠喚醒電腦Win10
- win10 休眠滑鼠喚醒怎麼設定_win10滑鼠休眠怎麼喚醒Win10
- win10怎麼禁止滑鼠喚醒 如何禁止滑鼠喚醒win10電腦休眠Win10
- 《空之旅人》喚醒測試9月8日開啟 養成美少女魂使天團
- USB裝置遠端喚醒RemoteWakeUpREM
- 多執行緒——虛假喚醒執行緒
- App相互喚醒的幾種方式APP
- h5喚醒APP小記H5APP
- win10睡眠喚醒藍屏怎麼解決_win10電腦待機後喚醒不久就會藍屏如何修復Win10
- 用 Python 指令碼實現電腦喚醒後自動拍照 截圖併發郵件通知Python指令碼
- win10 關閉滑鼠喚醒睡眠方法 win10怎麼關閉滑鼠喚醒睡眠Win10
- 用PHP編寫Android應用程式PHPAndroid
- win10計算機休眠後滑鼠不能喚醒瞭如何解決Win10計算機
- win10系統下睡眠後無法喚醒黑屏如何解決Win10
- Android Jetpack – 使用 WorkManager 管理後臺任務AndroidJetpack
- Android Jetpack - 使用 WorkManager 管理後臺任務AndroidJetpack