最近在做项目过程中,有一个LocalPush的需求,需要保持屏幕点亮一段时间,并且在这个时间里,启动Service来执行请求服务器的操作,拿到热点的数据。所以,就找了一下相关的android开源项目。从开源应用中吸收点儿东西,进行技术的积累。这里选择了jwood的Standup
Timer
项目。介绍一下PowerManager和PowerManager.WakeLock。

PowerManager.WakeLock

  PowerManager.WakerLock是我分析Standup Timer源代码时发现的一个知识点,Standup Timer 用WakeLock保证程序运行时保持手机屏幕的恒亮。PowerManager 和PowerManager.WakerLock7用于对Android设备的电源进行管理。
  PowerManager:This class gives you control of the power state of the device.
  PowerManager.WakeLock: lets you say that you need to have the device on.
  Android中通过各种类型的Lock锁对电源进行控制,需要注意的是加锁和解锁必须成对出现,否则,会出现锁不被释放的问题,会产生app非常耗电的现象。先copy一段Standup Timer里的代码进行说明。
[html] view
plain
copy

  1. 代码
  2. private void acquireWakeLock() {
  3. if (wakeLock ==null) {
  4. Logger.d("Acquiring wake lock");
  5. PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
  6. wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, this.getClass().getCanonicalName());
  7. wakeLock.acquire();
  8. }
  9. }
  10. private void releaseWakeLock() {
  11. if (wakeLock !=null&& wakeLock.isHeld()) {
  12. wakeLock.release();
  13. wakeLock =null;
  14. }
  15. }
acquireWakeLock()方法中获取了 SCREEN_DIM_WAKE_LOCK锁,该锁使 CPU 保持运转,屏幕保持点亮(可以变灰)。这个函数在Activity的 onResume中被调用。releaseWakeLock()方法则是释放该锁,它在Activity的 onPause中被调用。利用Activiy的生命周期,巧妙的让 acquireWakeLock()和releaseWakeLock()成对出现。
[html] view
plain
copy

  1. @Override
  2. protectedvoid onResume()
  3. {
  4. super.onResume();
  5. //获取锁,保持屏幕亮度
  6. acquireWakeLock();
  7. }
[html] view
plain
copy

  1. 代码
  2. protectedvoid onPause()
  3. {
  4. super.onPause();
  5. synchronized(this) {
  6. releaseWakeLock();
  7. if (finished) {
  8. clearState();
  9. } else {
  10. saveState();
  11. }
  12. }
  13. }
PowerManager和WakeLock的操作步骤
  1. PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);通过 Context.getSystemService().方法获取PowerManager对象的实例。
  2. 通过PowerManager的newWakeLock((int flags, String tag)来生成WakeLock实例。int
    Flags指示要获取哪种WakeLock,不同的Lock对cpu 、屏幕、键盘灯有不同影响。
  3. 获取WakeLock实例后通过acquire()获取相应的锁,然后进行其他业务逻辑的操作,最后使用release()释放(释放是必须的,否则,你懂的!!)。

关于int 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:if 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中声明该应用有设置电源管理的权限。
[html] view
plain
copy

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

另外,WakeLock的设置是 Activiy 级别的,也可以其他组件中使用,只要在acquire和release之间,执行完代码就可以了。不是针对整个Application应用的。比如我做的项目中的代码分享出来一段。

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

        PowerManager.WakeLock mwl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");

       
mwl .acquire();

        

        Intent serviceIntent = new Intent(context, LocalPushService.class);

        serviceIntent.putExtra(Constants.EXTRA_HOT_TOPIC_ALARM, true);

        context.startService(serviceIntent);



       
mwl .release();
      暂时总结这么多,希望对学习Android的同学有所用处,共同学习进步。

PowerManager和PowerManager.WakeLock详解的更多相关文章

  1. Android -- PowerManager和PowerManager.WakeLock

    PowerManager.WakeLock                                                       PowerManager.WakerLock是我 ...

  2. Wakelock API详解

    官方资料  http://developer.android.com/intl/zh-CN/reference/android/os/PowerManager.WakeLock.html http:/ ...

  3. Android核心分析之十五Android输入系统之输入路径详解

       Android用户事件输入路径 1 输入路径的一般原理 按键,鼠标消息从收集到最终将发送到焦点窗口,要经历怎样的路径,是Android GWES设计方案中需要详细考虑的问题.按键,鼠标等用户消息 ...

  4. android中getSystemService详解

        android的后台运行在很多service,它们在系统启动时被SystemServer开启,支持系统的正常工作,比如MountService监 听是否有SD卡安装及移除,ClipboardS ...

  5. Android 多线程之IntentService 完全详解

    关联文章: Android 多线程之HandlerThread 完全详解 Android 多线程之IntentService 完全详解 android多线程-AsyncTask之工作原理深入解析(上) ...

  6. adb shell命令模拟按键/输入input使用keycode 列表详解

    在adb shell里有一个非常使用的命令,模拟按键输入,这里首先不要理解为是键盘的模拟按键,下面命令的使用和键值做一个详解. input命令格式 adb shell input keyevent & ...

  7. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  8. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  9. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

随机推荐

  1. 排序算法之NB三人组

    快速排序 思路: 例如:一个列表[5,7,4,6,3,1,2,9,8], 1.首先取第一个元素5,以某种方式使元素5归位,此时列表被分为两个部分,左边的部分都比5小,右边的部分都比5大,这时列表变成了 ...

  2. 吴恩达深度学习笔记(deeplearning.ai)之卷积神经网络(一)

    Padding 在卷积操作中,过滤器(又称核)的大小通常为奇数,如3x3,5x5.这样的好处有两点: 在特征图(二维卷积)中就会存在一个中心像素点.有一个中心像素点会十分方便,便于指出过滤器的位置. ...

  3. POJ 2187 Beauty Contest [凸包 旋转卡壳]

    Beauty Contest Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 36113   Accepted: 11204 ...

  4. 小甲鱼OD学习第6讲

    这次我们的任务是破解这个通讯录的软件,首先,我们在通讯录一个分组添加第5个人,发现弹出对话框,限制每组只能添加4个人 并且发现最多只能添加3个分组 我们把程序载入OD,运行,添加人,这个时候点击暂停, ...

  5. struct stat结构体简介

    在使用这个结构体和方法时,需要引入: <sys/types.h> <sys/stat.h> struct stat这个结构体是用来描述一个linux系统文件系统中的文件属性的结 ...

  6. PHP7的新功能

    [转自:http://www.yiibai.com/php7/ ]   [PHP7标量类型声明] 在PHP7,一个新的功能,标量类型声明已被引入.标量类型声明有两种选择方式 - 强制方式- 强制性是默 ...

  7. 在Swift项目中使用OC,在OC项目中使用Swift

    几天前,我开始新的App的开发了.终于有机会把swift用在实战中了,也学到了之前纯学语法时没有机会获得的知识. 这篇博文中,我就如何使用swift.OC混编做一个介绍. OC中使用Swift 首先, ...

  8. Treap-平衡树学习笔记

    平衡树-Treap学习笔记 最近刚学了Treap 发现这种数据结构真的是--妙啊妙啊~~ 咳咳.... 所以发一发博客,也是为了加深蒟蒻自己的理解 顺便帮助一下各位小伙伴们 切入正题 Treap的结构 ...

  9. angular ng build --prod 打包报错解决方案

    使用以下代码  就不报错了 ng build --prod --no-extract-license    打包命令 使用以下代码  就不报错了 ng build --prod --no-extrac ...

  10. 【echarts3】--1 简单入门

    echarts3 相信大家都了解吧,是百度研发的 ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8 ...