Post navigation

Previous Next

Android 关于休眠的几个坑点

Posted on May 15, 2012 by luckyhu

首先看一下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保持运行。
设置代码如下:

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.向服务器轮询的代码不执行。

曾经做一个应用,利用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

更多相关文章

  1. Android:View的getLocalVisibleRect()和getGlobalVisibleRect()的区别
  2. [Android实例] android多点触摸demo
  3. Android(安卓)用手势切换activity
  4. Android设置全屏/屏幕常亮
  5. Android(安卓)2d物理引擎Box2d介绍
  6. Android(安卓)自定义相机页面
  7. android休眠与唤醒驱动流程分析
  8. android多点触摸demo
  9. android 唤醒屏幕并解锁

随机推荐

  1. Android(安卓)GPRS的自动打开与关闭
  2. Android之在ubuntu上用aapt查看apk的名字
  3. Android信息推送—AndroidPN的学习(上)
  4. 给Android新手的一些学习建议
  5. Android(安卓)8.0以上系统应用如何保活
  6. Android中的Shape的使用
  7. android 获取外置SD卡的路径(非挫版)
  8. Android控件——ViewFlipper的使用,垂直滚
  9. android 框架之WIFI系统和系统架构全面总
  10. Android之Handler、Looper、MessageQueue