出处:

http://www.dewen.org/q/2227?sort=active

一楼:

默认情况下,Android设备会在一段时间后使屏幕变暗,然后关闭屏幕显示,最后停止CPU,有时用户并不希望如此,因此Android提供了WakeLock类让用户实现自定义的电源管理,但是如果不合理使用这个功能,应用程序造成的电池电量消耗产生显著的影响,所以建议当用户观看屏幕但是很少与屏幕进行交互时(如看视频)使用,从而防止屏幕变暗。

二楼:

如果一开始就对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分钟,基本不会怎么耗电。除非网络不稳定,频繁断线重连,那种情况办法不多。


更多相关文章

  1. Android开发屏幕适配全攻略
  2. Android应用程序的完全退出
  3. Android应用程序与SurfaceFlinger服务的关系概述和学习计划 .
  4. (20120722)(笔记004)android开发应用程序资源
  5. Building Your First App(创建你的第一个应用程序)
  6. android 布局如何支持多种不同屏幕尺寸
  7. (转帖)Android开发者应该如何推广营销自己的应用程序
  8. 安卓热点话题总结性剖析:《Android在多屏幕、多设备上的适配》 |
  9. Android 超简单的录制屏幕视频及生成GIF文件的方法

随机推荐

  1. Mac环境下交叉编译生成Android版本的Assi
  2. android存储方式(转)
  3. Android根据屏幕宽度,按比例缩放图片
  4. 查看Android(安卓)ADT Plugin版本的方法
  5. android中短信协议与字段
  6. android 数据库 sqlite 操作
  7. android 定时一段时间执行
  8. 记一次Android(安卓)Studio的Enable VT-x
  9. 下拉刷新SwipeRefreshLayout源码
  10. [置顶] Android大数据读取与折半查找(初步