电量优化
1、在android framework里面有专门负责电量统计的Service:BatteryStatsSerive
①这个Service在ActivityManagerService中创建,代码如下:
mBatteryStatsService = new BatteryStatsService(new File(systemDir, 'batterystats.bin').toString());
②其他的模块比如WakeLock和PowerManagerService会向BatteryStatsService传递数据,数据是存放到系统目录batterystats.bin文件,然后交于BatteryStatsImpl这个数据分析器来进行电量数据的分析,系统的设置就是这样得到电量的统计信息的;
③电量的计算公式:
应用运行总时间 = 应用在Linux内核态运行时间 + 应用在Linux用户态运行时间
CPU工作总时间 = 软件运行期间CPU每个频率下工作的时间之和比例
应用消耗的电量 = CPU每个频率等级下工作的时间比例/CPU工作总时间 * 应用运行总时间
在09年GoogleIO大会JeffreySharkey的演讲(Coding for Life — Battery Life,That Is)中就探讨了这个问题,指出android应用的耗电主要在以下三个方面:
①大数据量的传输;
②不停的在网络间切换;
③解析大量的文本数据;
①在需要网络连接的程序中,首先检查网络连接是否正常,如果没有网络连接,那么就不需要执行相应的程序;
②判断网络类型,针对特定的数据在特定的网络下请求.例如:大量数据传输的时候在wifi下请求;wifi下下载数据耗电量只有2、3、4G的1/3.
③使用效率高的数据格式和解析方法,推荐使用JSON和Protobuf;
④在进行大数据量下载时,尽量使用GZIP方式下载;
⑤使用推送,代替循环请求
⑥其它:
尽量不要使用浮点运算;
回收java对象,特别是较大的java对像,使用reset方法;
主动回收java对象,特别是较大的,例如bitmap。减少GC的工作频率;
避免内存抖动,内存抖动是因为大量的对象被创建又在短时间内马上被释放;
避免在for循环、onDraw方法中创建对象;无法避免的可以创建对象池,然后在不使用的时候释放;
对定位要求不是太高的话尽量不要使用GPS定位,可以使用wifi和移动网络cell定位即可;
获取屏幕尺寸等信息可以使用缓存技术,不需要进行多次请求;
使用AlarmManager来定时启动服务替代使用sleep方式的定时任务;
使用JobScheduler合理分配任务
①JobScheduler 即 任务调度器
②需要先有一个JobService