Android亮屏、熄屏控制

       在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 ValueCPU Screen Keyboard
PARTIAL_WAKE_LOCKOn*                     Off                     Off                     
SCREEN_DIM_WAKE_LOCKOnDimOff
SCREEN_BRIGHT_WAKE_LOCKOnBrightOff
FULL_WAKE_LOCKOnBrightBright

      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..
wl.release();

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

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

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

<uses-permission android:name="android.permission.WAKE_LOCK" /> 

      2、获取PowerManager的实例;

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

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

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

public class AlertWakeLock {
	private static final String TAG = "AlertWakeLock";
	private static PowerManager.WakeLock sCpuWakeLock;

	static PowerManager.WakeLock createPartialWakeLock(Context context) {
		//第一步:获取PowerManager的实例
		PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
		if(null == pm){
			return null;
		}
		
		//第二步:调用PowerManager中的newWakeLock方法创建一个WakeLock对象
		return pm.newWakeLock(
                PowerManager.FULL_WAKE_LOCK |
                PowerManager.ACQUIRE_CAUSES_WAKEUP |
                PowerManager.ON_AFTER_RELEASE, TAG);
	}

	public static void acquireCpuWakeLock(Context context) {
		if (sCpuWakeLock != null) {
			return;
		}

		sCpuWakeLock = createPartialWakeLock(context);
		//第三步:acquire()获取相应的锁
		sCpuWakeLock.acquire();
	}

	public static void releaseCpuLock() {
		if (sCpuWakeLock != null) {
			//最后:release释放
			sCpuWakeLock.release();
			sCpuWakeLock = null;
		}
	}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值