Android應用程式 --- WakeLock 保持後台喚醒狀態

來源:互聯網
上載者:User

一些手機app(如、QQ等)有新訊息來到達,手機螢幕即使在鎖屏狀態下也會亮起,並提示使用者有新訊息。但是,一般情況下手機鎖屏後,Android系統為了省電以及減少CPU消耗,在一段時間後會使系統進入休眠狀態,這時,Android系統中CPU會保持在一個相對較低的功耗狀態,而收到新訊息必定有網路請求,而網路請求是消耗CPU的操作,那麼如何在鎖屏狀態乃至系統進入休眠後,仍然保持系統的網路狀態以及通過程式喚醒手機呢?答案就是Android中的WakeLock機制。


官方對於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.

 

Android 系統支援應用程式及服務在待機前儲存程式運行狀態,如待機前關閉檔案讀寫、usb 操作、暫停音樂播放;也支援喚醒後的程式狀態恢複,如恢複開啟檔案進行讀寫操作,恢複 usb 操作、恢複音樂播放等。這些狀態的儲存和恢複功能可以保證系統在待機喚醒後能正常工作。

主要提供兩種方式:

1、待機廣播訊息和喚醒廣播訊息。
2、Wakelock 鎖機制。
   
分為兩個部分說明一下:

1、android 系統待機處理機制

待機廣播訊息和喚醒廣播訊息
系統在 PowerManagerService 類中註冊了 2 個廣播分別用於待機前和喚醒後發送。

void initInThread(){
//喚醒後:
mScreenOnIntent=newIntent(Intent.ACTION_SCREEN_ON);//喚醒後發送
mScreenOnIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
//待機前:
mScreenOffIntent=newIntent(Intent.ACTION_SCREEN_OFF);//待機時發送
mScreenOffIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
}

這裡順帶說明一下廣播接收的優先順序問題:
接收者按照在 Manifest.xml 檔案中設定的接收順序依次接收Intent,順序執行的,接收的優先順序可以在系統設定檔中設定:
聲明在intent-filter元素的android:priority 屬性中,數值越大優先順序別越高,其取值範圍為-1000到1000。當然也可以在調用IntentFilter對象的setPriority()方法進行設定

Wakelock 鎖機制:
應用程式可以通過申請 wakelock 鎖的機制來對系統是否待機作出投票,當有任何一個應用申請了 wakelock 鎖,待機時沒有釋放掉,系統是不會進入待機的,直到所有應用的 wakelock 鎖都釋放掉了,才會進入待機。

2、應用程式使用方法:

執行個體代碼:


[java] view plaincopyprint?
<SPAN style="FONT-FAMILY: SimSun">  private WakeLock wakeLock = null; 
 
    /**
     * 擷取電源鎖,保持該服務在螢幕熄滅時仍然擷取CPU時,保持運行
     */ 
    private void acquireWakeLock() { 
        if (null == wakeLock) { 
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
            wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK 
                    | PowerManager.ON_AFTER_RELEASE, getClass() 
                    .getCanonicalName()); 
            if (null != wakeLock) { 
                Log.i(TAG, "call acquireWakeLock"); 
                wakeLock.acquire(); 
            } 
        } 
    } 
 
    // 釋放裝置電源鎖  
    private void releaseWakeLock() { 
        if (null != wakeLock && wakeLock.isHeld()) { 
            Log.i(TAG, "call releaseWakeLock"); 
            wakeLock.release(); 
            wakeLock = null; 
        } 
    }</SPAN> 

 private WakeLock wakeLock = null;

 /**
  * 擷取電源鎖,保持該服務在螢幕熄滅時仍然擷取CPU時,保持運行
  */
 private void acquireWakeLock() {
  if (null == wakeLock) {
   PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
   wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK
     | PowerManager.ON_AFTER_RELEASE, getClass()
     .getCanonicalName());
   if (null != wakeLock) {
    Log.i(TAG, "call acquireWakeLock");
    wakeLock.acquire();
   }
  }
 }

 // 釋放裝置電源鎖
 private void releaseWakeLock() {
  if (null != wakeLock && wakeLock.isHeld()) {
   Log.i(TAG, "call releaseWakeLock");
   wakeLock.release();
   wakeLock = null;
  }
 }
WakeLock 類型以及說明:

    PARTIAL_WAKE_LOCK:保持CPU 運轉,螢幕和鍵盤燈有可能是關閉的。
    SCREEN_DIM_WAKE_LOCK:保持CPU 運轉,允許保持螢幕顯示但有可能是灰的,允許關閉鍵盤燈
    SCREEN_BRIGHT_WAKE_LOCK:保持CPU 運轉,允許保持螢幕高亮顯示,允許關閉鍵盤燈
    FULL_WAKE_LOCK:保持CPU 運轉,保持螢幕高亮顯示,鍵盤燈也保持亮度
    ACQUIRE_CAUSES_WAKEUP:強制使螢幕亮起,這種鎖主要針對一些必須通知使用者的操作.
    ON_AFTER_RELEASE:當鎖被釋放時,保持螢幕亮起一段時間


最後 AndroidManifest.xml 聲明許可權:
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.DEVICE_POWER"/>


應用程式中如果要在待機前儲存資料狀態的話,要保證此過程中不會進入待機。可以在 onResume() 或者 onStart() 中申請 wakelock 鎖,即調用acquireWakeLock()方法。

在 onPause() 或者 onDistroy() 中處理應用待機後再釋放掉 wakelock 鎖,此時調用releaseWakeLock()方法

 


最後一點需要注意下:

另外WakeLock的設定是 Activiy 層級的,不是針對整個Application應用的。所以application下有多個activity一定需要注意下!

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.