什么原因使手机在夜晚排位休眠状态态下一亮一亮的不休眠

5493人阅读
Android性能优化(12)
任何一个应用申请了 wakelock 锁,待机(按:什么是待机?待机与屏幕黑、锁屏、休眠的关系是什么?)时没有释放掉,系统是不会进入待机的,直到所有应用的 wakelock 锁都释放掉了,才会进入待机。
如果不进行特别的设置,Android会在一定时间后屏幕变暗,在屏幕变暗后一定时间内,CPU也会休眠,大多数的程序都会停止运行,从而节省电量。
Android手机有两个处理器,一个叫Application Processor(AP),一个叫Baseband Processor(BP)。非通话时间,BP的能耗基本上在5mA左右,而AP只要处于非休眠状态,能耗至少在50mA以上,执行图形运算时会更高。一般手机待机时,AP、LCD、WIFI均进入休眠状态,这时Android中应用程序的代码也会停止执行。Android为了确保应用程序中关键代码的正确执行,提供了Wake Lock的API,使得APP可以通过之阻止AP进入休眠。但不一定必要,首先,完全没必要担心AP休眠会导致收不到消息推送。通讯协议栈运行于BP,一旦收到数据包(按:收到 TCP 数据包才会唤醒 AP,UDP 包不会唤醒),BP会将AP唤醒,唤醒的时间足够AP执行代码完成对收到的数据包的处理过程。其它的如Connectivity事件触发时AP同样会被唤醒。那么唯一的问题就是程序如何执行向服务器发送心跳包的逻辑。你显然不能靠AP来做心跳计时。Android提供的Alarm Manager就是来解决这个问题的。Alarm应该是BP计时(或其它某个带石英钟的芯片,不太确定,但绝对不是AP),触发时唤醒AP执行程序代码。那么Wake Lock API有啥用呢?比如心跳包从请求到应答,比如断线重连重新登陆这些关键逻辑的执行过程,就需要Wake Lock来保护(按:只在这些关键逻辑时,需要Wake Lock API确保不休眠)。而一旦一个关键逻辑执行成功,就应该立即释放掉Wake Lock了。两次心跳请求间隔5到10分钟,基本不会怎么耗电。除非网络不稳定,频繁断线重连,那种情况办法不多。
网上有说使用AlarmManager,因为AlarmManager 是Android 系统封装的用于管理 RTC 的模块,RTC (Real Time Clock) 是一个独立的硬件时钟,可以在 CPU 休眠时正常运行,在预设的时间到达时,通过中断唤醒 CPU。
休眠有early suspend和suspend,early suspend是可以通过alarm来唤醒的,但是suspend没法通过alarm来唤醒,进入suspend之后系统自带的闹钟程序都不会起作用了(按:待求证)。
Android 设置–& WLAN –&点击菜单键 选择 高级 –&休眠状态下保持WLAN连接的下拉列表{始终、仅限充电时、从不(会增加数据流量)},如果设置不为始终,那么我们锁屏休眠后,程序将会处于无网络状态,相应的app用户会一直处于离线模式。
开发中,可以在程序开启时,读取Settings.System.WIFI_SLEEP_POLICY值,保存起来,再将其值改为WIFI_SLEEP_POLICY_NEVER使本程序运行期间保持wifi连接,待程序退出时,将原先保存的值还原。
如下表,休眠有多种等级,最高等级的休眠是屏幕、键盘、cpu全部休眠:
Flag Value
PARTIAL_WAKE_LOCK
SCREEN_DIM_WAKE_LOCK
SCREEN_BRIGHT_WAKE_LOCK
FULL_WAKE_LOCK
可以设置不同的模式,让其产生不同的休眠,比如让cpu保持运行。
设置代码如下:
PowerManagerpm =(PowerManager)getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLockwl =pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK,"My Tag");
wl.acquire();
wl.release();
休眠几个坑点及解决:
1.向服务器轮询的代码不执行:曾经做一个应用,利用Timer和TimerTask,来设置对服务器进行定时的轮询,但是发现机器在某段时间后,轮询就不再进行了。查了很久才发现是休眠造成的。后来解决的办法是,利用系统的AlarmManager来执行轮询。因为虽然系统让机器休眠,节省电量,但并不是完全的关机,系统有一部分优先级很高的程序还是在执行的,比如闹钟,利用AlarmManager可以定时启动自己的程序,让cpu启动,执行完毕再休眠(按:如上述,就是通过 BP 唤醒 AP)。
2.后台长连接断开:最近遇到的问题。利用Socket长连接实现QQ类似的聊天功能,发现在屏幕熄灭一段时间后,Socket就被断开。屏幕开启的时候需进行重连,但每次看Log的时候又发现网络是链接的,后来才发现是cpu休眠导致链接被断开,当你插上数据线看log的时候,网络cpu恢复,一看网络确实是链接的, 坑。最后使用了PARTIAL_WAKE_LOCK,保持CPU不休眠。
3.调试时是不会休眠的:在调试2的时候,就发现,有时Socket会断开,有时不会断开,后来才搞明白,因为我有时是插着数据线进行调试,有时拔掉数据线,这时Android的休眠状态是不一样的。而且不同的机器也有不同的表现,比如有的机器,插着数据线就会充电,有的不会,有的机器的设置的充电时屏幕不变暗等等。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:677774次
积分:7907
积分:7907
排名:第1860名
原创:202篇
转载:48篇
评论:143条
(1)(1)(1)(1)(2)(2)(5)(7)(7)(7)(7)(9)(4)(1)(7)(3)(37)(8)(3)(6)(2)(2)(7)(3)(1)(9)(6)(5)(18)(1)(2)(2)(2)(5)(6)(7)(5)(26)(22)今日论坛第 1 个签到,每日签到可得财富值+2,连续5天签到后再连续签到则每日可得财富值
+4,记得每天都来签到哦~
上一主题:
下一主题:
查看: 28870 | 回复: 5
手机屏一直亮着。设置休眠时间到了也不全暗,非要按下锁屏键才暗,怎么回事?
交易信用 0
积分/帖子:15
连续签到天数:0
全部签到天数:0
注册时间:
手机型号:
状态: 离线
手机屏一直亮着。设置休眠时间到了也不全暗,非要按下锁屏键才暗,怎么回事?
求助[s:21]
财富值 334
交易信用 0
积分/帖子:268
连续签到天数:1
全部签到天数:20
注册时间:
手机型号:
状态: 离线
我怎么遇不到这样的问题,晕,你把时间设置成五秒看看,然后锁屏再开,等待锁屏时间到了再看看什么情况
心似浮云常自在 意如流水任东西
UID 3280968
财富值 99087
贡献值 20371
好评度 642
交易信用 0
人气值 4039
恢弘志士之气,不宜妄自菲薄
积分/帖子:27787
连续签到天数:51
全部签到天数:1267
注册时间:
手机型号:
来自:躬耕于南阳
状态: 离线
是否有第三方软件设置过呢?
财富值 2487
交易信用 0
积分/帖子:470
连续签到天数:1
全部签到天数:517
注册时间:
手机型号:
来自:崇左
状态: 离线
我没见过那样的问题,我一直用一个重力关屏从来都不用按电源键开关屏的
财富值 2487
交易信用 0
积分/帖子:470
连续签到天数:1
全部签到天数:517
注册时间:
手机型号:
来自:崇左
状态: 离线
怀疑你安装了哪一个使用重力关屏的软件并设置了移动亮屏,想想有没有?
财富值 2487
交易信用 0
积分/帖子:470
连续签到天数:1
全部签到天数:517
注册时间:
手机型号:
来自:崇左
状态: 离线
在设置~安全那里设置休眠后立即锁屏
微信扫一扫关注dospy

我要回帖

更多关于 英雄联盟休眠状态 的文章

 

随机推荐