文档章节

WakeLock保持后台唤醒状态

幸子
 幸子
发布于 2014/04/30 11:09
字数 1107
阅读 968
收藏 3
点赞 0
评论 0

官方对于WakeLock的解释:
    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 系统支持应用程序及服务在待机前保存程序运行状态,如待机前关闭文件读写、usb 操作、暂停音乐播放;也支持唤醒后的程序状态恢复,如恢复打开文件进行读写操作,恢复 usb 操作、恢复音乐播放等。这些状态的保存和恢复功能可以保证系统在待机唤醒后能正常工作。

主要提供两种方式:

1、待机广播消息和唤醒广播消息。
2、Wakelock 锁机制。
   
分为两个部分说明一下:

1、android 系统待机处理机制

待机广播消息和唤醒广播消息
系统在 PowerManagerService 类中注册了 2 个广播分别用于待机前和唤醒后发送。

void initInThread(){
//唤醒后:
mScreenOnIntent=newIntent(Intent.ACTION_SCREEN_ON);//唤醒后发送
mScreenOnIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
//待机前:
mScreenOffIntent=newIntent(Intent.ACTION_SCREEN_OFF);//待机时发送
mScreenOffIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
}

这里顺带说明一下广播接收的优先级问题:
接收者按照在 Manifest.xml 文件中设置的接收顺序依次接收Intent,顺序执行的,接收的优先级可以在系统配置文件中设置:
声明在intent-filter元素的android:priority 属性中,数值越大优先级别越高,其取值范围为-1000到1000。当然也可以在调用IntentFilter对象的setPriority()方法进行设置

Wakelock 锁机制:
应用程序可以通过申请 wakelock 锁的机制来对系统是否待机作出投票,当有任何一个应用申请了 wakelock 锁,待机时没有释放掉,系统是不会进入待机的,直到所有应用的 wakelock 锁都释放掉了,才会进入待机。

2、应用程序使用方法:

实例代码:


[java] view plaincopyprint?
<SPAN style="FONT-FAMILY: SimSun">  private WakeLock wakeLock = null; 
 
    /**
     * 获取电源锁,保持该服务在屏幕熄灭时仍然获取CPU时,保持运行
     */ 
    private void acquireWakeLock() { 
        if (null == wakeLock) { 
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
            wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK 
                    | PowerManager.ON_AFTER_RELEASE, getClass() 
                    .getCanonicalName()); 
            if (null != wakeLock) { 
                Log.i(TAG, "call acquireWakeLock"); 
                wakeLock.acquire(); 
            } 
        } 
    } 
 
    // 释放设备电源锁  
    private void releaseWakeLock() { 
        if (null != wakeLock && wakeLock.isHeld()) { 
            Log.i(TAG, "call releaseWakeLock"); 
            wakeLock.release(); 
            wakeLock = null; 
        } 
    }</SPAN> 

 private WakeLock wakeLock = null;

 /**
  * 获取电源锁,保持该服务在屏幕熄灭时仍然获取CPU时,保持运行
  */
 private void acquireWakeLock() {
  if (null == wakeLock) {
   PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
   wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK
     | PowerManager.ON_AFTER_RELEASE, getClass()
     .getCanonicalName());
   if (null != wakeLock) {
    Log.i(TAG, "call acquireWakeLock");
    wakeLock.acquire();
   }
  }
 }

 // 释放设备电源锁
 private void releaseWakeLock() {
  if (null != wakeLock && wakeLock.isHeld()) {
   Log.i(TAG, "call releaseWakeLock");
   wakeLock.release();
   wakeLock = null;
  }
 }
WakeLock 类型以及说明:

    PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。
    SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯
    SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,允许保持屏幕高亮显示,允许关闭键盘灯
    FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度
    ACQUIRE_CAUSES_WAKEUP:强制使屏幕亮起,这种锁主要针对一些必须通知用户的操作.
    ON_AFTER_RELEASE:当锁被释放时,保持屏幕亮起一段时间


最后 AndroidManifest.xml 声明权限:
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.DEVICE_POWER"/>


应用程序中如果要在待机前保存数据状态的话,要保证此过程中不会进入待机。可以在 onResume() 或者 onStart() 中申请 wakelock 锁,即调用acquireWakeLock()方法。

在 onPause() 或者 onDistroy() 中处理应用待机后再释放掉 wakelock 锁,此时调用releaseWakeLock()方法

 


最后一点需要注意下:

另外WakeLock的设置是 Activiy 级别的,不是针对整个Application应用的。所以application下有多个activity一定需要注意下!

附上一段手机开机启动log分析:






© 著作权归作者所有

共有 人打赏支持
幸子
粉丝 4
博文 4
码字总数 2934
作品 0
徐汇
高级程序员
后台唤醒

一些手机app(如微信、QQ等)有新消息来到达,手机屏幕即使在锁屏状态下也会亮起,并提示用户有新消息。但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使...

小克898 ⋅ 2016/08/16 ⋅ 0

Android如何实现后台唤醒(磨砺营马剑威Android)

1、待机广播消息和唤醒广播消息。2、Wakelock 锁机制。 1、android 系统待机处理机制 void initInThread(){//唤醒后:mScreenOnIntent=newIntent(Intent.ACTIONSCREENON);//唤醒后发送mScre...

磨砺营 ⋅ 2016/08/24 ⋅ 0

Android应用程序 --- WakeLock 保持后台唤醒状态

一些手机app(如微信、QQ等)有新消息来到达,手机屏幕即使在锁屏状态下也会亮起,并提示用户有新消息。但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使...

带梦想一7飞 ⋅ 2014/02/17 ⋅ 0

使用WakeLock使Android应用程序保持后台唤醒

在使用一些产品列如微信、QQ之类的,如果有新消息来时,手机屏幕即使在锁屏状态下也会亮起并提示声音,这时用户就知道有新消息来临了。但是,一般情况下手机锁屏后,Android系统为了省电以及...

zhouw ⋅ 2014/03/29 ⋅ 0

Android性能优化之电量优化

很多朋友都抱怨Android机电量不行,没有iPhone的耐用,问我怎么解决。我首先恭喜你们拥有一颗发现的眼睛,电量不耐用是Android的通病。明明电量是iPhone的几倍,但是可能还没有它耐用,为什么...

sinat_36668731 ⋅ 2017/09/05 ⋅ 0

WakeLock使用笔记

文档中对System.currentTimeMillis()进行了相应的描述,就是说它不适合用在需要时间间隔的地方,如Thread.sleep, Object.wait等,因为可以通过System.setCurrentTimeMillis来改变它的值。要用...

eric_zhang ⋅ 2012/08/06 ⋅ 0

Android的PowerManager和PowerManager.WakeLock用法简析

之前的一个社区PDA项目在采集使用者坐标这个功能的时候,需要保持屏幕常亮,面对未涉及过的东西,网络是最好的学习工具,便去找相关的资料,发现原来可以使用PowerManager.WakeLock来实现要求...

长平狐 ⋅ 2013/04/25 ⋅ 0

Android 功耗分析之wakelock

生活总是让我们遍体鳞伤,但到后来,那些受伤的地方一定会变成我们最强壮的地方。---海明威 WakeLock是什么 WakeLock是Android框架层提供的一套机制,应用使用该机制可以达到控制Android设备...

小草凡 ⋅ 2017/08/23 ⋅ 0

Android 平台上长连接的实现

Android 平台上长连接的实现 为了不让 NAT 表失效,我们需要定时的发心跳,以刷新 NAT 表项,避免被淘汰。 Android 上定时运行任务常用的方法有2种,一种方法用 Timer,另一种是AlarmManage...

jeffzhao ⋅ 2013/02/28 ⋅ 1

Android电源管理基础知识整理

前言 本文主要围绕如下问题进行知识收集整理: 待机、睡眠与休眠的区别? Android开发者官网当中提到“idle states”,该如何理解,这个状态会对设备及我们的程序造成何种影响? 进入Doze模式...

GrayMonkey ⋅ 2017/11/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 26分钟前 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 58分钟前 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 今天 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

【转】JS浮点数运算Bug的解决办法

37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这样,两个只有一位小数的数字相乘,怎...

NickSoki ⋅ 今天 ⋅ 0

table eg

user_id user_name full_name 1 zhangsan 张三 2 lisi 李四 `` ™ [========] 2018-06-18 09:42:06 星期一½ gdsgagagagdsgasgagadsgdasgagsa...

qwfys ⋅ 今天 ⋅ 0

一个有趣的Java问题

先来看看源码: public class TestDemo { public static void main(String[] args) { Integer a = 10; Integer b = 20; swap(a, b); System.out......

linxyz ⋅ 今天 ⋅ 0

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 今天 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部