Android 使用WakeLock
2014-02-04 22:45
316 查看
为了延长电池的使用寿命,Android设备会在一段时间后使屏幕变暗,然后关闭屏幕显示,最后停止CPU。WakeLock是一个电源管理系统服务功能,应用程序可以使用它来控制设备的电源状态。
WakeLock可以用来保持CPU运行,避免屏幕变暗和关闭,以及避免键盘背光灯熄灭。
注意:
创建和使用Wake Lock会对应用程序造成的电池电量消耗产生显著的影响。因此,最好只在
确实有必要时使用Wake Lock,并且使用它们的时间越少越好,只要有可 能就释放它们。
屏幕Wake Lock通常用于在用户观看屏幕但是很少与屏幕进行交互期间(例如,播放视频)防止屏幕变暗。
CPU Wake Lock用于防止设备进入休眠状态,直至执行了一个操作。当服务从意图接收器内启动时常常出现这种情况,因为意图接收器可能在设备休眠期间接收意图。值得注意的是,在这种情况下,系统将在广播接收器的整个onReceive处理程序中使用CPU Wake Lock。
注意:
如果在广播接收器的onReceive处理程序中启动一个服务或广播一个意图,那么有可能在服务
启动以前,所使用的Wake Lock就会被释放。为了确保服务能够执行,需要放置一个独立的Wake Lock。
实现步骤:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);通过
然后通过PowerManager的newWakeLock((int flags, String tag)来生成WakeLock实例。int
Flags指示要获取哪种WakeLock,不同的Lock对cpu 、屏幕、键盘灯有不同影响。
获取WakeLock实例后通过acquire()获取相应的锁,然后进行其他业务逻辑的操作,最后使用release()释放(释放是必须的)。
各种锁的类型对CPU 、屏幕、键盘的影响:
PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。
SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯
SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,允许保持屏幕高亮显示,允许关闭键盘灯
FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度
ACQUIRE_CAUSES_WAKEUP:Normal wake locks don't actually turn on the illumination. Instead, they cause the illumination to remain on once it turns on (e.g. from user activity). This flag will force the screen and/or
keyboard to turn on immediately, when the WakeLock is acquired. A typical use would be for notifications which are important for the user to see immediately.
ON_AFTER_RELEASE:f this flag is set, the user activity timer will be reset when the WakeLock is released, causing the illumination to remain on a bit longer. This can be used to reduce flicker if you are cycling
between wake lock conditions.
<uses-permission android:name="android.permission.WAKE_LOCK" />
你可能还需要
<uses-permission android:name="android.permission.DEVICE_POWER" />
另外WakeLock的设置是 Activiy 级别的,不是针对整个Application应用的。
可以在activity的onResume方法里面操作WakeLock, 在onPause方法里面释放。
例子:
WakeLock可以用来保持CPU运行,避免屏幕变暗和关闭,以及避免键盘背光灯熄灭。
注意:
创建和使用Wake Lock会对应用程序造成的电池电量消耗产生显著的影响。因此,最好只在
确实有必要时使用Wake Lock,并且使用它们的时间越少越好,只要有可 能就释放它们。
屏幕Wake Lock通常用于在用户观看屏幕但是很少与屏幕进行交互期间(例如,播放视频)防止屏幕变暗。
CPU Wake Lock用于防止设备进入休眠状态,直至执行了一个操作。当服务从意图接收器内启动时常常出现这种情况,因为意图接收器可能在设备休眠期间接收意图。值得注意的是,在这种情况下,系统将在广播接收器的整个onReceive处理程序中使用CPU Wake Lock。
注意:
如果在广播接收器的onReceive处理程序中启动一个服务或广播一个意图,那么有可能在服务
启动以前,所使用的Wake Lock就会被释放。为了确保服务能够执行,需要放置一个独立的Wake Lock。
实现步骤:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);通过
Context.getSystemService().方法获取PowerManager实例。
然后通过PowerManager的newWakeLock((int flags, String tag)来生成WakeLock实例。int
Flags指示要获取哪种WakeLock,不同的Lock对cpu 、屏幕、键盘灯有不同影响。
获取WakeLock实例后通过acquire()获取相应的锁,然后进行其他业务逻辑的操作,最后使用release()释放(释放是必须的)。
关于flags
各种锁的类型对CPU 、屏幕、键盘的影响:PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。
SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯
SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,允许保持屏幕高亮显示,允许关闭键盘灯
FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度
ACQUIRE_CAUSES_WAKEUP:Normal wake locks don't actually turn on the illumination. Instead, they cause the illumination to remain on once it turns on (e.g. from user activity). This flag will force the screen and/or
keyboard to turn on immediately, when the WakeLock is acquired. A typical use would be for notifications which are important for the user to see immediately.
ON_AFTER_RELEASE:f this flag is set, the user activity timer will be reset when the WakeLock is released, causing the illumination to remain on a bit longer. This can be used to reduce flicker if you are cycling
between wake lock conditions.
权限获取
要进行电源的操作需要在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方法里面释放。
例子:
public abstract class WakeLocker { private static PowerManager.WakeLock wakeLock; private static final String APP_TAG = "MyWakeLock"; public static void acquire(Context ctx) { if (wakeLock != null) wakeLock.release(); /* PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE| PowerManager.SCREEN_BRIGHT_WAKE_LOCK, APP_TAG); */ PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, APP_TAG); wakeLock.acquire(); } public static void release() { if (wakeLock != null) wakeLock.release(); wakeLock = null; } }
相关文章推荐
- 自定义滚轮效果选择器spinnerwheel的使用总结
- Android模拟器DPAD not enabled in avd
- android的splash启动画面
- Intent.ACTION_VIEW,Intent.ACTION_SENDTO
- android 之 Handler
- 《基于Android微博整合客户端的设计与实现》毕业设计论文任务书
- 64位的win7 配置android开发环境
- android自动启动服务
- android 开启或者隐藏软键盘
- 【转】如何设置Android软键盘的默认不弹出?
- Android自定义View带有删除按钮的EditText
- Android自定义View带有删除按钮的EditText
- Android 增量更新研究
- android ContentResolver详解
- Android点击通知栏信息后返回正在运行的程序,而不是一个新Activity
- Android自定义通知栏及响应通知栏事件
- Android相机拍照后在系统gallery中看不到的解决办法
- ListView进行平滑的移动
- MFx Patcher 4.10.1 最新破解补丁下载(Xamarin Mono For Android 4.10.01068 破解补丁)
- Android Duplicate files copied in APK