天天看點

使用WakeLock使Android應用程式保持背景喚醒



       在使用一些産品列如微信、qq之類的,如果有新消息來時,手機螢幕即使在鎖屏狀态下也會亮起并提示聲音,這時使用者就知道有新消息來臨了。但是,一般情況下手機鎖屏後,android系統為了省電以及減少cpu消耗,在一段時間後會使系統進入休眠狀态,這時,android系統中cpu會保持在一個相對較低的功耗狀态。針對前面的例子,收到新消息必定有網絡請求,而網絡請求是消耗cpu的操作,那麼如何在鎖屏狀态乃至系統進入休眠後,仍然保持系統的網絡狀态以及通過程式喚醒手機呢?答案就是android中的wakelock機制。

首先看看官方的解釋:

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、螢幕和鍵盤有不同的影響,第二個參數是自定義名稱。

各種鎖的類型對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一直處于輪詢狀态。

繼續閱讀