大多数的Android应用开发都会将注意力集中在界面功能上,只有少数应用会须要一个Service,尤为是一个长期运行的Service,去进行后台联网、环境检测、媒体播放等功能。Android环境下的Service有其自身的特色,为了让服务完美地实现预想的功能,首先要解决的一个重要问题就是:如何让你的服务优雅地活着。(太文艺了,请讲人话~~)
具体来讲,就是要作到两点:
1. 尽量运行
2. 尽量省电缓存
看似寻常的道理,实现起来还真不容易,下面一个个来看:网络
尽量运行
Android系统会根据当前资源情况(主要是内存空闲的状况)对后台服务进行不按期的清理,尤为是当内存高度紧张时,会出现大堆服务交替处于“正在重启服务”的状态。前台服务能够避免这个问题的发生,可是前提条件是你须要在通知栏显示一个置顶的没法清除的硕大的通知栏。若是你的应用恰巧是相似墨迹天气或者360这样正好须要一直给用户展现这样的一个通知栏,那么恭喜你,你能够忽略这个头痛的进程回收问题;可是对大多数后台服务来讲,显示这样的通知并不合适。你能够尝试修改服务优先级,可是在大多数手机上并不会有什么本质上的变化。
另一个须要考虑的问题是用户愈来愈频繁的“一键清理”操做,不管是系统内置的一键清理功能,仍是经过360、猎豹等提供的一键清理,都会增长服务杀死或重启的概率。固然,若是你的应用有正当理由请求用户授予root权限,那么太好了,一样也能够经过各类你懂的方式确保你的Service正常运行。架构
最后一个让你头疼的问题是休眠,嵌入式系统历来都会被设计成利用CPU提供的低功耗模式最大限度下降整机电流消耗,Android系统也不例外。传统上Android手机处理器被划分为AP核和CP核两部分,AP核负责系统和应用,CP核负责无线网络相关的功能,有些高端机还可能具有其余的功能核心,此外还有各式各样的外设,如GPS、传感器、LCD等。为了最小化电流消耗,当前用不到的功能模块都会经过芯片管脚直接切断电流供应或者切换成低功耗模式,其中也包括AP核。AP核一旦处于低功耗模式,一般状况下只能依靠硬件中断才能从新运行,包括CP核过来的网络事件、物理按键、或者是硬件Timer。所以,你的Service可能在任什么时候候忽然中止运行,这个忽然而来的STOP可能出如今你的任何进程中的任何线程中正在执行的任何一行代码,绝对不要假设Android系统会礼貌地等你执行完任何一个函数! 因此首先Service须要在架构上设计成能够应付随时重启,不要相信随时都能从缓存中获取到你想要的一切,定时器也常常没法按照你预想的正常工做,数据持久化方案须要花费更多的精力进行设计。另外为了隔离Service对主程序的影响,强烈建议将须要常驻后台的服务配置成独立进程,经过AIDL与主进程通信。最后,务必配合使用电源管理Wakelock和闹铃管理AlarmManager来控制避免系统进入休眠状态。
尽量省电
上面说到经过AlarmManager和Wakelock来确保Service的正常运行,然而频繁地唤醒系统以及用Wakelock锁定CPU就像是喝酒,适时适量有益身心健康,过分沉迷就会危及生命。一旦管理出问题,手机耗电量就会直线上升。目前多数手机厂商都是使用平均电流来评估应用的耗电量,即计算必定时间内未安装应用和安装应用状况下整机平均电流,两值相减即为应用的平均电流。一般Android手机待机状态下平均电流在8mA左右,若是你但愿你的应用内置到某款手机上,对不起,手机厂商对于耗电问题毫不手软,高于5mA平均电流消耗的应用一般是没法被接受的。以下图那样若是长时间工做致使持续高电流,会成倍增长应用的平均电流值。函数
为了更好地在耗电方面进行优化,首先须要了解到每唤醒一次AP核,都会带来一段时间的固定开销(多是几百ms),而后再从新休眠,即便你什么也不作。其次,唤醒后的耗电,通常只与工做时长有关,与工做强度关系不大,就我目前所知大多数ARM芯片尚未相似Intel芯片那种调频功能。
此外,负责网络处理的CP核的开启须要很是当心,由于CP核是耗电大户,并且为了提升网络通信效率,CP核开启后会保持比AP核更长的工做时间,根据手机和网络类型的不一样,多是1到5s甚至是更长时间。最后,也是最好理解的,每开启一个外设,都会额外增长耗电。
因此,优化的措施主要就是尽量减小唤醒的频率,以及进行任务合并,尤为是网络相关的操做,尽可能合并到同一时间内处理。在文件IO(尤为是网络IO)期间,AP核若是无所事事,就尽可能不要占用Wakelock,释放出来。当有网络事件须要处理时,CP负责唤醒AP,进行后续操做。要实现这点很不容易,根据业务需求,程序结构上须要作很细致的规划。最后就是,尽可能别碰其余的外设。优化
下面来看一下国内专业推送服务商 “个推”是怎么作的,做为专一推送三周年领先者,个推的作法是:1,开启流量合并通道。目前,大多第三方信息推送采用的方式是,为应用开发者提供SDK包嵌入应用程序来实现信息的推送。因而,每一个用户的手机里可能会有多个应用都包含了个推的SDK,也就是服务通道。这样,每一个SDK在信息推送过程当中,都会消耗一小部分的流量。个推能够自动将这样的多个推送服务通道合并,只开启一个通道便可。2,增量更新下载,,通常当应用有新版本时,咱们都须要下载一个全新的安装包,个推推送的应用版本更新通知时,只要升级差量部分便可,也起到很好的省电省流量的效果。spa
结束
没有一个应用但愿本身长期占据软件耗电排行榜首,若是应用再也不前台运行的时候也想作点有意义的事,就须要很是谨慎。若是每一个应用都不顾他人的感觉在手机上尽情撒野,那么总会有人站出来把这样的熊孩子揪出来干掉的。资源是你们的,请珍惜每1mAh的电。线程