一.Android省电开发之性能优化
电量优化
Android应用开发中的网络、定位、传感器等都是比较耗电的特性,我们应该正确使用API来有效降低应用的耗电量。
1.BroadcastReceiver:
在代码实现中需要尽量避免无用操作代码的执行,减少应用损耗的电量。
对于BroadcastReceiver,通常的做法是在界面onPasuse之后取消广播监听器的监听操作,同时根据具体业务需求选择当应用位于后台时是否禁用广播接收器。
2.数据传输:
数据传输方式:蓝牙传输,Wi-Fi传输,移动网络传输等。
优化:
后台数据传输的管理:根据具体业务需求,严格限制应用位于后台时是否禁用某些数据传输,尽量能够避免无效的数据传输。
数据传输的频度问题:通过经验值或者数据统计的方法确定好数据传输的频度,避免冗余重复的数据传输,数据传输过程中要压缩数据大小,合并网络请求,避免轮询等。
3.位置服务:
三种位置服务:
GPS定位:通过接收全球定位系统的卫星提供的经纬度坐标信息实现位置服务,精度是最高的,通常在10米以内,在时间和电量的消耗上也是最高的。
网络定位:通过移动通信的基站信号差异来计算出手机所在的位置,精度比GPS定位差很多,通常在几百米范围内。
被动定位:最省电的定位服务,如果应用使用被动定位服务,这个应用会等待手机中其他应用、服务或者系统组件发出定位请求,并和这些组件的监听器一起接收位置更新。
正确有限地使用位置服务器,减少应用耗电量。所以在代码中使用位置服务时,需要注意:
有没有及时注销位置监听器:长时间的监听位置更新会耗费大量的电量,通过可以选择在页面的onPasuse中进行注销操作,更好用且全局有效的做法是禁用位置监听器。
位置更新监听频率的设定:根据具体的业务需求设置一个合适的更新频率值,通常需要在定位精度和耗电量之间综合考虑。
多种位置服务的选择:综合考虑应用的具体需求在不同时机采用不同的定位服务或者选择第三方的定位SDK。
4.AlarmManager:
AlarmManager的唤醒操作是比较耗电的,通常情况下需要保证两次唤醒操作的时间间隔不要太短,在不需要使用唤醒功能的情况下尽早取消AlarmManager,否则应用会一直处于耗电状态。
5.WakeLock:
使用WakeLock时,需要切记及时释放锁,而且通常情况下,要尽早地释放WakeLock。保持屏幕常量
在屏幕关闭之后,系统休眠,一些任务可能会被暂停(Timer、Handler、Thread、Service),但是某些情况下我们需要保持屏幕常量,或者不需要屏幕常量但是需要CPU一直执行,直到任务的执行完成,那么我们可以手动设置屏幕常亮!//在Acitivty里面使用Flag
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); FLAG_KEEP_SCREEN_ON的好处是使用方便,不要额外的权限!
Android为了节省电量,会在用户无操作一段时间之后进入休眠状态。Wake Lock是一种锁的机制,只要有人拿着这个锁,系统就无法进入休眠。一些App为了能在后台持续做事情,就会持有一个WakeLock,那么手机就不会进入休眠状态,App要做的事情能做了,但是也更加耗电。
- App在前台不要申请WakeLock,此时无需申请,申请的话会计算到应用电量消耗;
- App在后台由于业务需要必须要申请WakeLock时使用带有超时参数的方法,防止由于忘记或者异常情况下没有释放;
- App申请使用WakeLock,任务结束之后及时释放,让系统再次进入休眠状态。
-
PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
-
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK| PowerManager.ON_AFTER_RELEASE,TAG);
-
wl.acquire(TIMEOUT);// 使用带有超时参数的acquire方法 // ... do work...
-
wl.release();
二.Android省电开发之CPU降频
众所周知,在android系统的耗电量排行里,cpu的耗电占 了比较大的一部分比例,也就是说,cpu的使用率和使用频率将直接或间接的影响电量的分配和使用,但很遗憾,android-sdk中没有为 android的开发者提供类似cpu管理的功能,但是当下很多省电类应用或专业的cpu管理软件都提供了cpu的降频甚至是超频的功能。
三.Android省电开发之service
Android应用开发中,难免会遇到service开发。android中服务是运行在后台的东西,级别与activity差不多。既然说service是运行在后台的服务,那么它就是不可见的,没有界面 的东西。Service和其他组件一样,都是运行在主线程中,因此不能用它来做耗时的请求或者动作。你可以在服务中开一一个线程,在线程中做耗时动作。
我们从三个方面来浅析一下service的省电开发
1. 查看service是否存活以及降低优先级:
假如一个service工作完成,但是来不及关掉或者kill掉,用户又看不见,所以这个service将会一直在后台运行,势必耗电。所以我们可以降低某些不常用service进程的优先级,在系统内存吃紧的情况下, 进程优先级低的service容易被系统kill掉。除此之外,可以利用监听系统广播来判断service状态是否存活,死亡即可手动kill掉。
2. 用IntentService代替Service开发:
普通服务一旦启动之后,就会一直处于运行状态,必须调用stopService()或者stopSelf()方法才能让服务停止下来。为了简单的创建一个异步的、会自动挺值得服务,Android专门提供了一个IntentService类。IntentService在运行完毕后自动停止,减少耗电量。
3. 后台执行的定时任务Alarm机制:
Service没必要一直在后台运行,这时候的定时任务显得很重要。Android的定时任务有两种实现方式,Timer类和Alarm机制。Timer有一个明显的短板,不适合长期后台运行的定时任务。为了能让电池更加耐用,每种手机都会有自己的休眠策略,Android手机就会在长时间不操作的情况下自动让CPU进入到睡眠状态,这就有可能导致Timer中的定时任务无法正常运行。而Alarm机制则不存在这种情况,它具有唤醒CPU的功能,即可以保证每次需要执行定时任务的时候CPU能正常工作。重点来了:从Android 4.4之后,Alarm任务的触发时间将会变得不准确,有可能会延迟一段时间后任务才能得到执行。这不是bug,而是系统在耗电性方面进行的优化。系统会自动检测目前有多少Alarm任务存在,然后将触发时间将近的几个任务放在一起执行,这就可以大幅度的减少CPU被唤醒的次数,从而有效延长电池的使用时间。
四.Android省电开发之网络
除了常规的异步网络、多线程技术、本地缓存等等之外,Android省电开发还有一个重要的方面是:wifi比蜂窝数据,包括2G(GPRS)、3G更省电:a)尽量在Wi-Fi下传输数据,当然这是废话,不过可以考虑在有Wi-Fi的时候做预加载,比如应用中心的zip包、手Q web类应用的离线资源等;b)非Wi-Fi下,尽量减少网络访问,每一次后台交互都要考虑是否必须。虽然WiFi接入方式已经占到移动互联网用户的50%,但是是有些手机设置为待机关闭WiFi连接,即便有Wi-Fi信号也只能切换到蜂窝数据;
看了一篇博文,上面数据测试,也不知道正确与否,但是能说明一定的问题。灭屏情况:灭屏传输,高负载download的时候WiFi最省电(70mA),3G(270mA)和2G(280mA)相当,是WiFi的4倍左右;亮屏情况:亮屏传输,高负载download的时候WiFi最省电(280mA),3G(360mA)和2G(370mA)相当,是WiFi的1.3倍左右;所以在Android应用省电开发中,我们可以在获取网络方式的方面加以考虑。
五.Android省电开发之Android L5.0(ART)登场
1. 默认的ART运行模式
最新的安卓4.4系统中引入了全新的ART模式吗,相比之前流行已久的Dalvik模式有了很大的改变。因此LZ为大家制作了以下这张ART模式和Dalvik模式区别对比图表,通过对比,可以一眼看出 ART模式和Dalvik模式之间的区别。
这篇博客写的很好http://www.cnblogs.com/shaweng/p/3811461.html
在Dalvik中,应用每次运行,字节码都需要通过即时编译器转换为机器码,这回拖慢应用的运行效率,而在ART环境中,应用在第一次安装时,字节码就会预先编译成机器码,使其成为了真正的本地应用。这个过程叫做预编译。这样的话,应用的启动和执行都会变得更加快速。但是ART的缺点是预编译完的机器人占用了更大的存储空间,应用的安装需要更长的时间。但是牺牲空间时间换取省电速度,在Android应用中还是可以接受的,毕竟性能的提升,运行速度的变快,体验更流畅,电池续航更久显得更重要。
经测试,谷歌最新的Android L系统与上一版本相比续航能力可以提升36%。
Android 5.0的亮点http://lib.91.com/comments/141029/21755059.html
2. 利用JobScheduler API
过去,如果开发人员想通过后台调取服务器数据,或完成某些处理工作,应用程序必须先监听是否有事件正在发生,并为自己设定一个唤醒时间,一旦应用程序开始运行,他需要检查各种环境条件,以确定是否具备条件让它完成工作,还是需要稍后再试,这种方式不仅复杂,而且容易出错,它会不断的浪费资源,比如当 一个应用程序被唤醒后,发现条件不符合就只能去睡觉并为下次唤醒再次设定时间,这是一个反复的过程。
这个问题,将引用JobScheduler来修复,它作为一个调度应用程序,负责当应用程序被唤醒时,提供适当的运行环境,所以开发者不用再让程序检测环境是否符合需求,开发人员只需要按照标准的流程来,调度程序会自动为唤醒的程序,准备好运行环境。应用程序可以使用这个调度程序,来唤醒他们,比如当设备连接到充电器后,调度程序将唤醒那些需要处理器工作的程序,让他们进行工作,或者在设备连接至WiFi网络的时候上传下载照片,更新内容等。该调度程序还支持一个时间窗口,以便它可以唤醒一组应用程序,这将使那些不需要精确唤醒时间,但每隔一两小时需要运行一次的程序能在同一时间点运行,这样就能让处理器保持更长时间的休眠。
JobScheduler的优势相当巨大,它不仅可以帮助手机节省电量, 实际由于不在需要监听,更改和设置报警,还可以帮助开发人员减少代码书写量。目前该JobScheduler类,已经加入Android L开发者预览版。
3. 各种省电新模式和新技术
(1) 全新的Material Design风格用户界面;
新的用户界面更加简洁、色彩更加丰富。动画效果更加合理生动,同时加入实时阴影的3D视图,更多的使用卡片风格的显示效果。全平台风格也变得更为统一。
(2) 新的通知消息系统;
允许用户管理通知中心中的通知消息。原先的Android通知栏几乎是处于无法控制的状态,所有的应用通知都会弹出,要想关闭只能进到每一个应用中去单独设置,或是使用第三方软件来实现统一管理。但是现在不用了,Android 5.0已经自带了通知管理界面。
(3) 多任务界面有着全新的Google Now卡片风格;
通知中心融入更多的卡片式风格,即使是在锁屏状态下也可以进行多种功能操作。同时用户可以自定义通知的优先级别,使得用户不会错过任何重要的通知。还可以设置特定的通知权限,只有被允许的通知消息才会推送。同时还具有操作性,比如用户在游戏时有电话打入,不会以全屏显示,而是弹出可操作的通知卡片,用户可选择接听或拒接,不影响游戏继续进行。
(4) Project Volta省电模式、BatterySaver省电模式;
Android 5.0的省电模式是通过JobSchedulerAPI以及自动调节屏幕亮度、刷新率来达到省电的效果,而且还使用了Project Volta量化每个应用的耗电量,在手机快没电的情况下主动降低CPU的主频或者关闭通讯模块,以获得更长的待机时间。还配备了一个Battery Bistorian电池历史记录功能,可让详细显示设备的耗电情况。