1. 程式人生 > >Android的PowerManager和PowerManager.WakeLock用法簡析

Android的PowerManager和PowerManager.WakeLock用法簡析

之前的一個社群PDA專案在採集使用者座標這個功能的時候,需要保持螢幕常亮,面對未涉及過的東西,網路是最好的學習工具,便去找相關的資料,發現原來可以使用PowerManager.WakeLock來實現要求的功能,以下的文字部分轉載自網路上的一篇有關部落格,感覺寫的還比較清楚,可以學習並用來寫到專案中,原文連結。     

許可權獲取

要進行電源的操作需要在AndroidManifest.xml中宣告該應用有設定電源管理的許可權。

<uses-permission android:name="android.permission.WAKE_LOCK"/> 你可能還需要 <uses-permission android:name="android.permission.DEVICE_POWER"/>

另外WakeLock的設定是 Activiy 級別的,不是針對整個Application應用的。  

附上簡單的純粹用來螢幕喚醒的一段程式碼來說明:

  1. package com.eyu.wake_lock;

  2. import android.app.Activity;

  3. import android.os.Bundle;

  4. import android.os.PowerManager;

  5. import android.os.PowerManager.WakeLock;

  6. public class Wake_lockActivity extends Activity {

  7. private boolean iswakeLock = true;// 是否常亮

  8. private WakeLock wakeLock;

  9. /** Called when the activity is first created. */

  10. @Override

  11. public void onCreate(Bundle savedInstanceState) {

  12. super.onCreate(savedInstanceState);

  13. setContentView(R.layout.main);

  14. }

  15. @Override

  16. protected void onResume() {

  17. // TODO Auto-generated method stub

  18. PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);

  19. wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK

  20. | PowerManager.ON_AFTER_RELEASE, "DPA");

  21. if (iswakeLock) {

  22. wakeLock.acquire();

  23. }

  24. super.onResume();

  25. }

  26. @Override

  27. protected void onPause() {

  28. // TODO Auto-generated method stub

  29. super.onDestroy();

  30. if (wakeLock != null) {

  31. wakeLock.release();

  32. }

  33. android.os.Process.killProcess(android.os.Process.myPid());

  34. }

  35. }

通常在onRusume方法中將獲得到的鎖使用acquire()方法來保持喚醒,在onPause方法中使用release()方法來釋放掉該鎖,利用Activity的生命週期來巧妙的使這兩種方法成對的出現。

PowerManager和WakeLock的操作步驟

  1.   PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);通過 .方法獲取PowerManager例項。
  2.   然後通過PowerManager的newWakeLock((int flags, String tag)來生成WakeLock例項。int Flags指示要獲取哪種WakeLock,不同的Lock對cpu 、螢幕、鍵盤燈有不同影響。
  3.   獲取WakeLock例項後通過acquire()獲取相應的鎖,然後進行其他業務邏輯的操作,最後使用release()釋放(釋放是必須的)。

關於int flags

  各種鎖的型別對CPU 、螢幕、鍵盤的影響:

PARTIAL_WAKE_LOCK:保持CPU 運轉,螢幕和鍵盤燈有可能是關閉的。

SCREEN_DIM_WAKE_LOCK:保持CPU 運轉,允許保持螢幕顯示但有可能是灰的,允許關閉鍵盤燈

SCREEN_BRIGHT_WAKE_LOCK:保持CPU 運轉,允許保持螢幕高亮顯示,允許關閉鍵盤燈

FULL_WAKE_LOCK:保持CPU 運轉,保持螢幕高亮顯示,鍵盤燈也保持亮度

ACQUIRE_CAUSES_WAKEUP:正常喚醒鎖實際上並不開啟照明。相反,一旦開啟他們會一直仍然保持(例如來世user的activity)。當獲得wakelock,這個標誌會使螢幕或/和鍵盤立即開啟。一個典型的使用就是可以立即看到那些對使用者重要的通知。

ON_AFTER_RELEASE:設定了這個標誌,當wakelock釋放時使用者activity計時器會被重置,導致照明持續一段時間。如果你在wacklock條件中迴圈,這個可以用來減少閃爍