Android 电源服务 ( PowerManager )
PowerManager(电源服务) ,用于管理 CPU 运行,键盘或屏幕亮起来
PowerManager
PowerManager
是 Android 系统为我们提供的电源管理的一个API,其相关接口与设备电池的续航能力有很大的关联
官方也说了,除非是迫不得已吧,不然的话,应该尽量避免使用这个类,并且使用完以后一定要及时释放
所谓的电源管理包括: CPU运行,键盘或者屏幕亮起来
核心其实就是 wakelock锁 机制,只要我们拿着这个锁,那么系统就无法进入休眠状态,可以给用户态程序或内核获取到。 锁可以是:" 有超时的 "或者 " 没有超时 ",超时的锁到时间后会自动解锁,如果没有了锁或超时,内核会启动休眠机制来进入休眠
WakeLock 锁介绍
PowerManager.WakeLock 有 加锁 与 解锁 两种状态,而加锁的形式有两种:
-
永久锁住
这种锁除非显式的放开,否则是不会解锁的,所以用起来需要非常小心
-
超时锁
到时间后就会解锁,而创建WakeLock后,有 两种加锁机制 :
- 不计数锁机制
- 计数锁机制(默认) 可通过 setReferenceCounted** (boolean value)来指定
区别在于:
前者无论 acquire ( )多少次,一次 release ( )就可以解开锁
后者则需要 (--count == 0) 的时候,同样当 (count == 0) 才会去申请锁
所以, WakeLock 的计数机制并不是正真意义上对每次请求进行申请/释放一个锁
只是对同一把锁被 申请/释放 的次数来进行统计,然后再去操作
PowerManager 怎么用
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock w1 = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "MyTag"); w1.acquire(); //在这个过程,屏幕会保持光亮! w1.release();
newWakeLock()
的第一个 flag 标记 ,这些标记不同程度的影响系统电源
这些标记都是独占的,并且每次只能指定其中一个
标记 | 说明 |
---|---|
PARTIAL_WAKE_LOCK | 保持 CPU 运转,屏幕和键盘灯有可能是关闭的 |
SCREEN_DIM_WAKE_LOCK | 保持 CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯 |
SCREEN_BRIGHT_WAKE_LOCK | 保持 CPU 运转,允许保持屏幕高亮显示,允许关闭键盘灯 |
FULL_WAKE_LOCK | 保持 CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度 |
如果使用的是局部唤醒锁的话(使用 PARTIAL_WAKE_LOCK 标志),CPU 会继续运行, 将忽略任何的计时器,甚至按下电源按钮
其它的唤醒锁话,CPU 也会继续运转,但是使用者仍然可以按电源按钮让设备睡眠
另外,可以使用两个以上的标记,但是它只影响屏幕的行为
和 PARTIAL_WAKE_LOCK 同时使用的话,没有任何影响
屏幕解锁参数
-
ACQUIRE_CAUSES_WAKEUP
正常唤醒锁实际上并不打开照明
相反,一旦打开它们会一直仍然保持。当获得 wakelock,这个标志会使屏幕或和键盘立即打开
一个典型的使用就是可以立即看到那些对用户重要的通知
-
ON_AFTER_RELEASE
设置了这个标志,当 wakelock 释放时用户 activity 计时器会被重置,导致照明持续一段时间
如果在 wacklock 条件中循环,这个可以用来降低闪烁
配置权限
要进行电源的操作需要在 AndroidManifest.xml
中声明该应用有设置电源管理的权限
<uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.DEVICE_POWER"/>
注意: WakeLock 设置是 Activity 级别的,不是针对整个 Application 应用的
参考文档
- 官方 API 文档: PowerManager