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.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.PowerManager;  
  6. import android.os.PowerManager.WakeLock;  
  7.   
  8. public class Wake_lockActivity extends Activity {  
  9.   
  10.     private boolean iswakeLock = true;// 是否常亮   
  11.     private WakeLock wakeLock;  
  12.   
  13.     /** Called when the activity is first created. */  
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.main);  
  18.   
  19.     }  
  20.   
  21.     @Override  
  22.     protected void onResume() {  
  23.         // TODO Auto-generated method stub   
  24.         PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);  
  25.         wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK  
  26.                 | PowerManager.ON_AFTER_RELEASE, "DPA");  
  27.   
  28.         if (iswakeLock) {  
  29.             wakeLock.acquire();  
  30.         }  
  31.         super.onResume();  
  32.   
  33.     }  
  34.   
  35.     @Override  
  36.     protected void onPause() {  
  37.         // TODO Auto-generated method stub   
  38.         super.onDestroy();  
  39.         if (wakeLock != null) {  
  40.             wakeLock.release();  
  41.         }  
  42.         android.os.Process.killProcess(android.os.Process.myPid());  
  43.     }  
  44.   
  45. }  
package com.eyu.wake_lock;  import android.app.Activity; import android.os.Bundle; import android.os.PowerManager; import android.os.PowerManager.WakeLock;  public class Wake_lockActivity extends Activity {  	private boolean iswakeLock = true;// 是否常亮 	private WakeLock wakeLock;  	/** Called when the activity is first created. */ 	@Override 	public void onCreate(Bundle savedInstanceState) { 		super.onCreate(savedInstanceState); 		setContentView(R.layout.main);  	}  	@Override 	protected void onResume() { 		// TODO Auto-generated method stub 		PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); 		wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK 				| PowerManager.ON_AFTER_RELEASE, "DPA");  		if (iswakeLock) { 			wakeLock.acquire(); 		} 		super.onResume();  	}  	@Override 	protected void onPause() { 		// TODO Auto-generated method stub 		super.onDestroy(); 		if (wakeLock != null) { 			wakeLock.release(); 		} 		android.os.Process.killProcess(android.os.Process.myPid()); 	}  }

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

 


 

PowerManager和WakeLock的操作步驟
  1.   PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);通過 Context.getSystemService().方法獲取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條件中循環,這個可以用來減少閃爍



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM