在Android應用開發中,不少的應用需要和屏幕打交道,例如鬧鐘響鈴的時候要保持屏幕處於亮屏狀態,而在提醒過後又需要將屏幕熄滅。那麼,在Android中是怎樣來控制亮屏和熄屏的呢?下面就揭開神秘的面紗。
一、PowerManager和PowerManager.WakeLock
從標題中就可以大概看出這兩者的關系,它們的靜態結構如下:
下面分別說一下它們的作用:
1、PowerManager
PowerManager是一個系統服務類,它是用來控制設備的電源的狀態,例如,goToSleep就可以使設備進入睡眠狀態,setBacklightBrightness可以用來控制背光的亮度。
PowerManager作為一個系統的服務,在整個系統中只有一個實例,所以可以使用Context.getSystemService()來獲取:
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
分析到這裡,可以更進一步的看出兩者之間的關系,PowerManager是系統級別的管理者,每一個Application需要使用WakeLock都需要通過它來分配。
pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
上面的代碼就是用來創建一個WakeLock的方法,其中,PowerManager.PARTIIAL_WAKE_LOCK是一個標志位,標志位是用來控制獲取的WakeLock對象的類型,主要涉及到CPU、屏幕和鍵盤燈,下面說一下標志位的意義。
表一
Flag Value CPU Screen Keyboard PARTIAL_WAKE_LOCK On* Off Off SCREEN_DIM_WAKE_LOCK On Dim Off SCREEN_BRIGHT_WAKE_LOCK On Bright Off FULL_WAKE_LOCK On Bright Bright2、PowerManager.WakeLock
該類可以用來控制設備的工作狀態。使用該類中的acquire可以用來使設備一直處於工作的狀態,當然如果你不需要使用該設備了,就調用release來關閉。注意:在使用該類的時候,必須保證acquire和release是成對出現的。
根據acquire的實現,可以知道有兩種方式可以確保acquire和release成對出現:
(1)、自動release
public void acquire(long timeout) {
synchronized (mToken) {
acquireLocked();
mHandler.postDelayed(mReleaser, timeout);
}
}
調用該方法,就可以實現在timeout之後會自動調用release。
(2)、手動release
public void acquire() {
synchronized (mToken) {
acquireLocked();
}
}
該函數不會自動release,就需要用戶手動調用,所以使用的方式如下:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
wl.acquire();
..screen will stay on during this section..
wl.release();