1. 程式人生 > >android 螢幕常亮程式碼

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

.getSystemService(Service.POWER_SERVICE);

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


========================