android wakelock机制,Android锁屏状况下保持背景唤醒WakeLock机制

android wakelock机制,Android锁屏状况下保持背景唤醒WakeLock机制少许手机app(如微信、QQ等)有新消息来到达,手机屏幕即使在锁屏状况下也会亮起,并提示用户有新消息。不过,普通环境动手机锁屏后,Android系统为了省电以及削减CPU花消,在一段光阴后会使系统进入休眠状况,这时,Android系统中CPU会保持在一个相对较低的功耗状况,而收到新消息必定有网页要求,而网页要求是花消CPU的操纵,辣么若何在锁屏状况甚至系统进入休眠后,仍旧保持系统的网页状况以及通过…

少许手机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;

}

}

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 申明权限:

运用程序中如果要在待机前留存数据状况的话,要包管此过程当中不会进入待机。可以在 onResume() 大概 onStart() 中要求 wakelock 锁,即挪用acquireWakeLock()要领。

在 onPause() 大概 onDistroy() 中处分运用待机后再开释掉 wakelock 锁,此时挪用releaseWakeLock()要领

末了一点必要留意下:

另外WakeLock的设置是 Activiy 级另外,不是针对全部Application运用的。以是application下有多个activity必然必要留意下!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/35596.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注