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

Android从熄屏唤醒屏幕 【代码】Android从熄屏唤醒屏幕。 阅读详情
一些手机app(如微信、QQ等)有新消息来到达,手机屏幕即使在锁屏状态下也会亮起,并提示用户有新消息。但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入休眠状态,这时,Android系统中CPU会保持在一个相对较低的功耗状态,而收到新消息必定有网络请求,而网络请求是消耗CPU的操作,那么如何在锁屏状态乃至系统进入休眠后,仍然保持系统的网络状态以及通过程序唤醒手机呢?答案就是Android中的WakeLock机制。


官方对于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、应用程序使用方法:

实例代码:

	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一定需要注意下!


Android 编程中的 Wake Lock 使用详解及示例代码 在使用 Wake Lock 时,需要根据具体需求选择合适的 Wake Lock 类型,并在任务完成后及时释放 Wake Lock,以便设备可以进入休眠状态,节省电量。在上述示例中,我们在 MusicPlayerService 的 onCreate() 方法中获取了一个 PARTIAL_WAKE_LOCK 的 Wake Lock,并在 onDestroy() 方法中释放了该 Wake Lock。在获得 Wake Lock 后,可以执行需要持续运行的任务,直到任务完成或不再需要设备处于唤醒状态。 阅读详情

相关推荐

Android应用程序保持后台唤醒(使用WakeLock实现)

本篇文章主要介绍了使用WakeLock使Android应用程序保持后台唤醒的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧

Android Framework 电源子系统(02)系统休眠 wakelock机制

系列文章解读&说明: Android Framework 电源子系统 的分析主要分为以下部分: Android Framework 电源子系统(01)PowerManagerService启动分析 Android Framework 电源子系统(02)系统休眠wakelock机制 Android Framework 电源子系统(03)核心方法updatePowerStateLoc...

wangdsh的博客 2491

FIFO应用于UART串口(含代码)

FIFO(First in first out)即先入先出,可以把它理解成一个缓存器,对于收发两端速度不一致,位宽不一致的情况可以使用FIFO作为收发两端中间的“调节剂”使数据可以进行正常发送。

m0_58544042的博客 2747

WakeLock使用

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

fengyuxing168的专栏 1308

《活用数据——驱动业务的数分析实战》读书笔记 (实战篇)

第四章、战略分析案例解析         如思维篇所述,分析思路是从研究目的到研究内容的分解过程。因此需要考虑如下两个问题: 战略分析的研究目的 战略分析的研究内容 1、研究目的:战略选择         战略分析的研究目的是帮助企业进行战略选择,选择适合自己的目标市场。需要回答以下两个问题: 市场吸引力:这个市...

Xiaozhu的博客 3698

【AutoDL】使用云服务器跑深度学习代码

1.算力市场 租用服务器,选择自己心仪的服务器2.镜像可以选择一些基础的镜像,社区镜像里是git上有的环境。3.上传文件在文件存储中,选择上传的区,在右边点击上传,选择自己的文件上传到云服务器中。

weixin_45768644的博客 3701

自动唤醒 android 7,Android应用程序 --- WakeLock 保持后台唤醒状态

一些手机app(如微信、QQ等)有新消息来到达,手机屏幕即使在锁屏状态下也会亮起,并提示用户有新消息。但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入休眠状态,这时,Android系统中CPU会保持在一个相对较低的功耗状态,而收到新消息必定有网络请求,而网络请求是消耗CPU的操作,那么如何在锁屏状态乃至系统进入休眠后,仍然保持系统的网络状态以及通过...

weixin_35511997的博客 1033

大白话系列:什么是微服务

用大白话和实际例子来通俗易懂地告诉你什么是微服务~

2401_87403086的博客 1240

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

一些手机app(如微信、QQ等)有新消息来到达,手机屏幕即使在锁屏状态下也会亮起,并提示用户有新消息。但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入休眠状态,这时,Android系统中CPU会保持在一个相对较低的功耗状态,而收到新消息必定有网络请求,而网络请求是消耗CPU的操作,那么如何在锁屏状态乃至系统进入休眠后,仍然保持系统的网络状态以及通过

qinglinyi的专栏 821

AES-128-CMAC:背景、汽车应用、CAPL 实现与开源工具验证

本文详解车载诊断中AES-128-CMAC算法的原理与应用,涵盖其在UDS安全访问、刷写鉴权、SecOC认证及密钥派生中的核心作用。结合真实汽车电子场景,提供纯CAPL实现代码与测试脚本,并通过pycryptodome进行逐字节验证,确保算法正确性。全程基于CANoe实测数据,可直接用于HIL环境复现,助力开发者高效落地汽车网络安全方案。

蚂蚁小兵 111

高通平台 Android T 蓝牙技术全解析:A2DP 与 AVRCP 核心代码路径与交互流程

A2DP 接收端 - 连接流程(AVDTP 打开)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 288

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

一些手机app(如微信、QQ等)有新消息来到达,手机屏幕即使在锁屏状态下也会亮起,并提示用户有新消息。但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入休眠状态,这时,Android系统中CPU会保持在一个相对较低的功耗状态,而收到新消息必定有网络请求,而网络请求是消耗CPU的操作,那么如何在锁屏状态乃至系统进入休眠后,仍然保持系统的网络状态以及通过

一点一滴积累! 1358

地图自定义编码CSV转换成ini文件

创 建 schema.ini 文件:有时,当您尝试使用 .csv 文件将自定义地理信息导入 Tableau 时,您可能会看到“无法使用.csv,因为它不包含唯一列”错误消息。这是因为您的 .csv 文件可能包含数值数据,例如数值邮政编码。对于新的地理角色,Tableau 将只接受文本字段。但是,您可以创建一个 schema.ini 文件,以指示 Tableau 应将您要导入的数值字段视为文本字段。...

wenyusuran的专栏 1975

[置顶] Android代码----应用程序通过WakeLock保持后台唤醒状态

一些手机app(如微信、QQ等)有新消息来到达,手机屏幕即使在锁屏状态下也会亮起,并提示用户有新消息。但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入休眠状态,这时,Android系统中CPU会保持在一个相对较低的功耗状态,而收到新消息必定有网络请求,而网络请求是消耗CPU的操作,那么如何在锁屏状态乃至系统进入休眠后,仍然保持系统的网络状态以及通过...

weixin_30871701的博客 224

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

在使用一些产品列如微信、QQ之类的,如果有新消息来时,手机屏幕即使在锁屏状态下也会亮起并提示声音,这时用户就知道有新消息来临了。但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入休眠状态,这时,Android系统中CPU会保持在一个相对较低的功耗状态。针对前面的例子,收到新消息必定有网络请求,而网络请求是消耗CPU的操作,那么如何在锁屏状态乃至系统进

Ryan's zone 6万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

android两个service互相唤醒,唤醒锁定android服务重复出现

我有这个应用程序需要运行定期发出蜂鸣声的服务(背景).手机需要每隔一分钟发出一声哔哔声,持续5秒钟(在服务中使用了一个处理程序).我已经实现了这项完美的服务,但是当手机进入深度睡眠模式时,此处理程序的执行停止会停止.使用SO中的问题的this答案,我设法使用唤醒锁,它工作正常.但是当我明确地将手机置于深度睡眠模式时,处理程序停止执行.我在哪里将唤醒锁放在服务中.下面的代码片段.public cla...

weixin_36339157的博客 426

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

前言: 一些手机app(如微信、QQ等)有新消息来到达,手机屏幕即使在锁屏状态下也会亮起,并提示用户有新消息。但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入休眠状态,这时,Android系统中CPU会保持在一个相对较低的功耗状态,而收到新消息必定有网络请求,而网络请求是消耗CPU的操作,那么如何在锁屏状态乃至系统进入休眠后,仍然保持系统的网络状...

Jason_Lee155的博客 657
上一篇: 如何根据meta-data内容杀指定应用
下一篇: <<一分钟经理人>> 读后笔记
andyhuabing
博客等级 码龄19年 704粉丝 165原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值