android 唤醒设备 cpu后台不休眠

转载 2016年05月30日 16:50:27

一些手机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、应用程序使用方法:

实例代码:

[java] view plaincopyprint?

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

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

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

android 唤醒屏幕并解锁

public static void wakeUpAndUnlock(Context context){ KeyguardManager km= (KeyguardManager) c...
  • jdsjlzx
  • jdsjlzx
  • 2014年02月12日 16:01
  • 26313

安卓CPU休眠Timer不执行

在开发中,有时我们需要在后台循环执行一些操作(比如:即时通讯心跳包的发送)。 xml布局文件: RelativeLayout xmlns:android="http://schemas.andr...

android保持服务不休眠(持续运行)以及唤醒屏幕的方法

假设有这样一个应用场景,一个服务一直在默默的工作(比如即时地获取服务器的消息),即使在屏幕已经因为长时间无操作而关闭,或者用户按了电源键让屏幕关闭,手机进入休眠状态,他必须依然在工作中。一旦从服务器获...
  • wzj0808
  • wzj0808
  • 2016年09月21日 16:03
  • 5360

Android 关于休眠的几个坑点

首先看一下Android Powermanager Class Overview,对Android的几种不同的休眠模式有个大致了解。 如果不进行特别的设置,Android会在一定时间后屏幕变暗,...

android 电源管理 wakelock 唤醒锁机制

https://software.intel.com/zh-cn/android/articles/wakelocks-for-android Android 电源管理 — 唤醒锁全...

【Android休眠】之PowerKey唤醒源实现

版本信息: Linux:3.10 Android: 4.4 一、唤醒源 设备休眠后,通过触发唤醒源使设备恢复正常工作模式。设备唤醒源有多种,对于Android设备常见的就有PowerKey、来电唤...

如何防止启动的后台Service在系统休眠的情况下不被休眠

最近在做项目时,发现启动的Service在后台服务会休眠,导致其不能一直在工作,搜索资料后找到了解决方案:     对于这种情况我们可以使用焕醒机制WakeLock.        具体操作方法:...

android休眠与唤醒驱动流程分析

android休眠与唤醒驱动流程分析 标准linux休眠过程: powermanagement notifiers are executed with PM_SUSPEND_PREPARE...

拥抱Android:编译nodejs搭建移动平台

https://github.com/dna2github/dna2oslab/tree/master/android/build 有了python,可是感觉库不全,于是就想想,要不编译下nodejs...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android 唤醒设备 cpu后台不休眠
举报原因:
原因补充:

(最多只允许输入30个字)