在Android应用开发中,不少的应用需要和屏幕打交道,例如闹钟响铃的时候要保持屏幕处于亮屏状态,而在提醒过后又需要将屏幕熄灭。那么,在Android中是怎样来控制亮屏和熄屏的呢?下面就揭开神秘的面纱。



一、PowerManager和PowerManager.WakeLock



      从标题中就可以大概看出这两者的关系,它们的静态结构如下:


android 手机亮屏灭屏实现 android熄屏_android

      下面分别说一下它们的作用:


       1、PowerManager



      PowerManager是一个系统服务类,它是用来控制设备的电源的状态,例如,goToSleep就可以使设备进入睡眠状态,setBacklightBrightness可以用来控制背光的亮度。


      PowerManager作为一个系统的服务,在整个系统中只有一个实例,所以可以使用Context.getSystemService()来获取:


[java]  view plain copy


1. PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);

      分析到这里,可以更进一步的看出两者之间的关系,PowerManager是系统级别的管理者,每一个Application需要使用WakeLock都需要通过它来分配。


[java]  view plain copy


1. 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

Bright



      2、PowerManager.WakeLock

      该类可以用来控制设备的工作状态。使用该类中的acquire可以用来使设备一直处于工作的状态,当然如果你不需要使用该设备了,就调用release来关闭。注意:在使用该类的时候,必须保证acquire和release是成对出现的。

      根据acquire的实现,可以知道有两种方式可以确保acquire和release成对出现:

      (1)、自动release


[java]  view plain copy


1. public void acquire(long timeout) {  
2. synchronized (mToken) {  
3.         acquireLocked();  
4.         mHandler.postDelayed(mReleaser, timeout);  
5.     }  
6. }

      调用该方法,就可以实现在timeout之后会自动调用release。


      (2)、手动release


[java]  view plain copy



    1. public void acquire() {  
    2. synchronized (mToken) {  
    3.         acquireLocked();  
    4.     }  
    5. }


          该函数不会自动release,就需要用户手动调用,所以使用的方式如下:


    [java]  view plain copy


    1. PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);  
    2. PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");  
    3. wl.acquire();  
    4. this section..  
    5. wl.release();



    二、PowerManager和PowerManager.WakeLock的使用步骤

          说到这里,我们来总结一下使用这两个类的步骤,主要分为四步:

          1、在AndroidManifest.xml中添加权限:


    [html]  view plain copy


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

      另外WakeLock的设置是 Activiy 级别的,不是针对整个Application应用的。



      可以在activity的onResume方法里面操作WakeLock,  在onPause方法里面释放。



            2、获取PowerManager的实例;

            3、调用PowerManager的newWakeLock(int flags, String tag)的方法创建一个WakeLock的对象,其中flags标志位用来指示要获取的WakeLock的类型,不同的WakeLock对CPU、键盘和键盘灯有不同的影响,详细可以参照上一节的表一

      通过acquire()获取相应的锁,然后进行其他业务逻辑的操作,最后使用release()释放(释放是必须的)。



      三、PowerManager和PowerManager.WakeLock的使用实例


      [java]  view plain copy



        1. public class AlertWakeLock {  
        2. private static final String TAG = "AlertWakeLock";  
        3. private static PowerManager.WakeLock sCpuWakeLock;  
        4.   
        5. static PowerManager.WakeLock createPartialWakeLock(Context context) {  
        6. //第一步:获取PowerManager的实例  
        7.         PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);  
        8. if(null == pm){  
        9. return null;  
        10.         }  
        11.           
        12. //第二步:调用PowerManager中的newWakeLock方法创建一个WakeLock对象  
        13. return pm.newWakeLock(  
        14.                 PowerManager.FULL_WAKE_LOCK |  
        15.                 PowerManager.ACQUIRE_CAUSES_WAKEUP |  
        16.                 PowerManager.ON_AFTER_RELEASE, TAG);  
        17.     }  
        18.   
        19. public static void acquireCpuWakeLock(Context context) {  
        20. if (sCpuWakeLock != null) {  
        21. return;  
        22.         }  
        23.   
        24.         sCpuWakeLock = createPartialWakeLock(context);  
        25. //第三步:acquire()获取相应的锁  
        26.         sCpuWakeLock.acquire();  
        27.     }  
        28.   
        29. public static void releaseCpuLock() {  
        30. if (sCpuWakeLock != null) {  
        31. //最后:release释放  
        32.             sCpuWakeLock.release();  
        33. null;  
        34.         }  
        35.     }  
        36. }