-
// 电源管理
-
PowerManager
pm
=
(
PowerManager
)
TalkMessageServer
.
this
.
getSystemService
(
Context
.
POWER_SERVICE
);
-
wakeLock
=
pm
.
newWakeLock
(
PowerManager
.
PARTIAL_WAKE_LOCK
,
"com.task.TalkMessageService"
);
-
wakeLock
.
acquire
();
-
// 然后程序如果要退出,并且关闭服务的话 在Service的onDestroy中
-
if
(
wakeLock
!=
null
)
{
-
wakeLock
.
release
();
-
wakeLock
=
null
;
-
// 使用这段代码依然无法解决问题
网上有说使用AlarmManager,因为AlarmManager 是Android 系统封装的用于管理 RTC 的模块,RTC (Real Time Clock) 是一个独立的硬件时钟,可以在 CPU 休眠时正常运行,在预设的时间到达时,通过中断唤醒 CPU。
但是目前我需要的是网络持续连接比如网络通信,定时或周期轮询无法解决问题。
android 如何使用Wake Lock来节电?
从上面的连接里面找到了一些资料:
如果一开始就对Android手机的硬件架构有一定的了解,设计出的应用程序通常不会成为待机电池杀手,而要设计出正确的通信机制与通信协议也并不困难。但如果不去了解而盲目设计,可就没准了。
首先Android手机有两个处理器,一个叫Application Processor(AP),一个叫Baseband Processor(BP)。AP是ARM架构的处理器,用于运行Linux+Android系统;BP用于运行实时操作系统(RTOS),通讯协议栈运行于BP的RTOS之上。非通话时间,BP的能耗基本上在5mA左右,而AP只要处于非休眠状态,能耗至少在50mA以上,执行图形运算时会更高。另外LCD工作时功耗在100mA左右,WIFI也在100mA左右。一般手机待机时,AP、LCD、WIFI均进入休眠状态,这时Android中应用程序的代码也会停止执行。
Android为了确保应用程序中关键代码的正确执行,提供了Wake Lock的API,使得应用程序有权限通过代码阻止AP进入休眠状态。但如果不领会Android设计者的意图而滥用Wake Lock API,为了自身程序在后台的正常工作而长时间阻止AP进入休眠状态,就会成为待机电池杀手。比如前段时间的某应用,比如现在仍然干着这事的某应用。
首先,完全没必要担心AP休眠会导致收不到消息推送。通讯协议栈运行于BP,一旦收到数据包,BP会将AP唤醒,唤醒的时间足够AP执行代码完成对收到的数据包的处理过程。其它的如Connectivity事件触发时AP同样会被唤醒。那么唯一的问题就是程序如何执行向服务器发送心跳包的逻辑。你显然不能靠AP来做心跳计时。Android提供的Alarm Manager就是来解决这个问题的。Alarm应该是BP计时(或其它某个带石英钟的芯片,不太确定,但绝对不是AP),触发时唤醒AP执行程序代码。那么Wake Lock API有啥用呢?比如心跳包从请求到应答,比如断线重连重新登陆这些关键逻辑的执行过程,就需要Wake Lock来保护。而一旦一个关键逻辑执行成功,就应该立即释放掉Wake Lock了。两次心跳请求间隔5到10分钟,基本不会怎么耗电。除非网络不稳定,频繁断线重连,那种情况办法不多。
android设备在屏幕关掉之后一段时间会进入睡眠状态,这个时候cpu进入休眠,网络也会中断;如何让其在进入休眠之后依然保持网络连接?// 电源管理PowerManager pm = (PowerManager) TalkMessageServer.this.getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLo
长连接定
时
唤醒cpu(解决黑屏定位、黑屏
断网
问题)
对于原生
Android
系统可采用google给出的提升后台应用进程优先级的解决方案来解决,可参考google
Android
开
发者官网。
对于国内厂商提供的
Android
系统需要联系到对应的厂商进行系统底层应用白名单授权,才可以保证App进程在后台处于活跃状态。
CPU会处于
休眠
状态(不同厂商生产的
设备
CPU
休眠
时
间不尽
在使用一些产品列如微信、QQ之类的,如果有新消息来
时
,手机屏幕即使在
锁屏
状态下也会亮起并提示声音,这
时
用户就知道有新消息来临了。但是,一般情况下手机
锁屏
后,
Android
系统为了省电以及减少CPU消耗,在一段
时
间后会使系统
进入
休眠
状态,这
时
,
Android
系统中CPU会
保持
在一个相对较低的功耗状态。针对前面的例子,收到新消息必定有
网络
请求,而
网络
请求是消耗CPU的操作,那么如何在
锁屏
状态乃至系统
进入
休眠
后,仍然
保持
系统的
网络
状态以及通过程序唤醒手机呢?答案就是
Android
中的WakeLock机制。
首先看看官方的解释:
PowerManager:This class gives you co
//旧版本的SDK
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
boolean isScreenOn = powerManager.isScreenOn();
//新版本的SDK
powermanager = (PowerManager) MainActivity.this.getSystemService(Con...
Android
9.x应用待机群组特性导致后台应用无法联网问题分析9.x增加的电源管理新特性1 应用分组2 查看和修改分组3 省电管理白名单源码分析
9.x增加的电源管理新特性
我们在工作中发现一个问题,我们的一个应用,启动
时
只启动一个后台服务,而不会启动界面。并且在后台服务中
网络
请求超
时
。但是如果启动一个activity之后,就可以正常联网。
Android
P(9.x)为了更加严格的限制后台应用...
如果
Android
设备
在
休眠
状态下唤醒之后无法上网,可能是因为以下原因之一:
1. 连接到的 WiFi 或移动数据
网络
可能已经断
开
,导致无法上网。可以尝试手动断
开
网络
连接,然后再重新连接。
2.
设备
可能存在
网络
设置问题,导致无法连接到
网络
。可以尝试重启
设备
,或者检查
网络
设置是否正确。
3. 可能是
网络
服务提供商的服务故障导致的无法上网。可以尝试检查
网络
服务商的
网络
状态,或者联系服务商解决问题。
4.
设备
可能存在硬件故障,导致无法连接到
网络
。可以尝试检查
设备
是否正常工作,或者联系
设备
制造商解决问题。
如果上述方法都无法解决问题,可以尝试使用
安卓
系统自带的
网络
诊断工具来检查
网络
连接情况。