Android 关于休眠的几个坑点

首先看一下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 Brightui

如上表,最高等级的休眠是屏幕,键盘等,cpu都所有休眠。能够设置不一样的模式,让其产生不一样的休眠,好比让cpu保持运行。
设置代码以下:this

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

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

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

曾经作一个应用,利用Timer和TimerTask,来设置对服务器进行定时的轮询,可是发现机器在某段时间后,轮询就再也不进行了。查了好久才发现是休眠形成的。后来解决的办法是,利用系统的AlarmService来执行轮询。由于虽然系统让机器休眠,节省电量,但并非彻底的关机,系统有一部分优先级很高的程序仍是在执行的,好比闹钟,利用AlarmService能够定时启动本身的程序,让cpu启动,执行完毕再休眠。get

2.后台长链接断开。io

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

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

相关文章
相关标签/搜索