http://blog.csdn.net/acicadasound/article/details/8333910
在Android应用开发中,不少的应用需要和屏幕打交道,例如闹钟响铃的时候要保持屏幕处于亮屏状态,而在提醒过后又需要将屏幕熄灭。那么,在Android中是怎样来控制亮屏和熄屏的呢?下面就揭开神秘的面纱。
一、PowerManager和PowerManager.WakeLock
从标题中就可以大概看出这两者的关系,它们的静态结构如下:
下面分别说一下它们的作用:
1、PowerManagerPowerManager是一个系统服务类,它是用来控制设备的电源的状态,例如,goToSleep就可以使设备进入睡眠状态,setBacklightBrightness可以用来控制背光的亮度。
PowerManager作为一个系统的服务,在整个系统中只有一个实例,所以可以使用Context.getSystemService()来获取:
- PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
- pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
表一
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
- public void acquire(long timeout) {
- synchronized (mToken) {
- acquireLocked();
- mHandler.postDelayed(mReleaser, timeout);
- }
- }
(2)、手动release
- public void acquire() {
- synchronized (mToken) {
- acquireLocked();
- }
- }
- 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" />
可能还需要
<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、键盘和键盘灯有不同的影响,详细可以参照上一节的表一。
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;
- }
- }
- }