Android 关于休眠的几个坑点

转载 2013年12月04日 18:20:57

首先看一下Android Powermanager Class Overview,对Android的几种不同的休眠模式有个大致了解。

如果不进行特别的设置,Android会在一定时间后屏幕变暗,在屏幕变暗后一定时间内,约几分钟,CPU也会休眠,大多数的程序都会停止运行,从而节省电量。但你可以在代码中通过对Powmanager API的调用来设置不同的休眠模式。

Flag Value CPU Screen Keyboard
PARTIAL_WAKE_LOCK On* Off Off
SCREEN_DIM_WAKE_LOCK On Dim Off
SCREEN_BRIGHT_WAKE_LOCK On Bright Off
FULL_WAKE_LOCK On Bright Bright

如上表,最高等级的休眠是屏幕,键盘等,cpu都全部休眠。可以设置不同的模式,让其产生不同的休眠,比如让cpu保持运行。
设置代码如下:

  1. PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);  
  2. PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");  
  3. wl.acquire();  
  4.    ..screen will stay on during this section..  
  5. wl.release();  


 

我曾经遇到的几个坑点及解决:

1.向服务器轮询的代码不执行。

曾经做一个应用,利用Timer和TimerTask,来设置对服务器进行定时的轮询,但是发现机器在某段时间后,轮询就不再进行了。查了很久才发现是休眠造成的。后来解决的办法是,利用系统的AlarmService来执行轮询。因为虽然系统让机器休眠,节省电量,但并不是完全的关机,系统有一部分优先级很高的程序还是在执行的,比如闹钟,利用AlarmService可以定时启动自己的程序,让cpu启动,执行完毕再休眠。

2.后台长连接断开。

最近遇到的问题。利用Socket长连接实现QQ类似的聊天功能,发现在屏幕熄灭一段时间后,Socket就被断开。屏幕开启的时候需进行重连,但每次看Log的时候又发现网络是链接的,后来才发现是cpu休眠导致链接被断开,当你插上数据线看log的时候,网络cpu恢复,一看网络确实是链接的,坑。最后使用了PARTIAL_WAKE_LOCK,保持CPU不休眠。

3.调试时是不会休眠的。
让我非常郁闷的是,在调试2的时候,就发现,有时Socket会断开,有时不会断开,后来才搞明白,因为我有时是插着数据线进行调试,有时拔掉数据线,这时Android的休眠状态是不一样的。而且不同的机器也有不同的表现,比如有的机器,插着数据线就会充电,有的不会,有的机器的设置的充电时屏幕不变暗等等,把自己都搞晕了。其实搞明白这个休眠机制,一切都好说了。

 

转自 http://www.whoslab.me/blog/?p=474

Android socket在系统休眠情况下调研

做了3年的IM应用,一直没有确认过socket在系统休眠的情况下会不会就收不到消息了,网上也搜过一些资料说android手机分为AP和BP两个部分,系统休眠的时候AP是休眠的,而BP是不休眠的,网络协...
  • flyalizee
  • flyalizee
  • 2015年07月21日 22:59
  • 1335

Android中Handler的理解与总结

android的异步处理消息机制Handler这个问题是老生常谈哪,这个要追溯到一个面试的场景了,面试官说,handler发送完消息后,什么时候触发循环,这个我说了,handler源码中有个loope...
  • shenshibaoma
  • shenshibaoma
  • 2016年12月26日 18:35
  • 424

安卓第三方微信登陆及其中的坑

做一个项目使用微信登陆。使用过程中只能吐槽BAT三大公司的服务还是阿里做的最好,不管是文档说明,Demo还是客服服务。微信登陆中的坑真是太多了。为避免以后再走同样的坑和其他人采坑,分享一下过程。 ...
  • jia635
  • jia635
  • 2016年08月15日 16:52
  • 896

Android-Handler机制【占坑中】

先占坑!
  • Fisher0113
  • Fisher0113
  • 2016年06月17日 16:05
  • 175

android里面线程睡眠事件使用方法

SystemClock.sleep(时间); 不用Thread.sleep()的原因:要抛异常,占用资源
  • zhangli_
  • zhangli_
  • 2015年11月19日 15:38
  • 6094

Android开发遇到的坑

最近在开发中总会遇到各种坑,由于记忆力不好,先记录在这里。 以前看过的一些总结,基本上很齐全了: http://jcodecraeer.com/plus/view.php?aid=3773 https...
  • ly635676581
  • ly635676581
  • 2016年11月25日 16:31
  • 393

说一下我在listview上遇到的坑

ListView对于每一个Android的开发人员来说都不陌生,它的应用在开发过程中也是比较高的,虽然它很好用,当时ListView的本事也是有一些坑的,现在说一下我遇到过的问题。    问...
  • qq_35366908
  • qq_35366908
  • 2017年01月20日 16:54
  • 294

android计时与系统休眠

android计时与系统休眠 摘要:之前做项目的时候,修改一个倒计时秒表,本来以为比较简单,但是发现很多有趣的东西。我们项目里面用的是Timer计时的方法,但是,当系统休眠的时候,Timer也是处于休...
  • liu8497548
  • liu8497548
  • 2015年03月05日 11:24
  • 2260

Android微信支付彻底扫坑

由于公司运营需要,Android客户端要增加微信支付。在看了几遍官方文档之后,加上之前有集成微信分享的经验,所以很快就把调用微信支付的代码写好了,待微信支付相关接口完成后联调时,才发现山高路远坑深啊!...
  • u014738140
  • u014738140
  • 2015年12月04日 13:31
  • 18008

修改Android 休眠逻辑使系统关屏而不进入休眠

近日接到一个比较诡异的产品需求,在我看来需要修改Android PMS。 具体需求如下:         要求在某一Activity界面在灭屏之后也能监听屏幕的手势事件,在我看来这种手势事件需求应该放...
  • DKBDKBDKB
  • DKBDKBDKB
  • 2016年11月30日 11:34
  • 2819
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 关于休眠的几个坑点
举报原因:
原因补充:

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