android 螢幕常亮程式碼
螢幕保持常亮,有以下兩種方法。
方法一 :
直接在onCreate()裡,不用許可權
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
方法二 :
1
<uses-permissionandroid:name="android.permission.WAKE_LOCK"/>
2
private PowerManager powerManager =null;
private WakeLock wakeLock = null;
powerManager = (PowerManager)this
wakeLock =this.powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK,"My Lock");
//是否需計算鎖的數量
wakeLock.setReferenceCounted(false);
//請求常亮,onResume()
wakeLock.acquire();
//取消螢幕常亮,onPause()
wakeLock.release();
===========================
在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、螢幕和鍵盤燈,下面說一下標誌位的意義。
表一
各種鎖的型別對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: 在釋放鎖(release())後,手機螢幕仍會繼續亮一會兒。
2、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..
if (wl != null) {
wl.release();
wl = null;
}
系統不睡眠時通過命令列檢視Wake Lock的命令為:
adb shell dumpsys power;
打印出來的即是當前鎖狀態資訊。
也可以adb shell進去,cd /sys/power/,
cat wake_lock;如cat wake_lock後打印出結果為powerservice,即存在一個powerservice wakelock,
手動清除當前wakelock用echo wakelockname > wake_unlock,即將存在的wakelock寫進wake_unlock,如echo powerservice > wake_unlock。
========================