在运用开发中,耗电是咱们需求重视的要点。但是,开端进行耗电优化时,咱们常常感到无从下手。这篇文章将介绍耗电优化的相关要点,让咱们优化时有一个方向。
传感器
大多数Android设备都内置传感器,假如你的 App 需求运用传感器,记得在不运用时及时撤销注册监听,否则会让 app 在后台一直接纳数据,形成不必要的耗电。
如上图,谷歌官方文档上写的很清楚。当咱们在Activity切到后台后依然会调用传感器,一般来说onPause之后就现已是非事务场景,在 destroy之前都会继续占用传感器,形成不必要的耗电。
其次,注册传感器时,能够选择传感器精度,精度越高耗电也就越多,咱们需求依据事务实际需求选择合适的精度,不要盲目寻求高精度。
定位
定位从获取办法能够分为两种,主动获取 或 被迫定位。主动获取又能够分为 GPS 和 网络定位。
-
GPS_PROVIDER(GPS办法):
- GPS定位,精准度高耗电量大;
- 室内GPS定位基本没用。
- 绝大部分用户默许不敞开GPS模块;
- 从GPS模块启动到获取第一次定位数据,或许需求比较长的时刻;
-
NETWORK_PROVIDER(网络定位):
网络定位,利用基站和WIFI节点的地址来定位,取决于将基站或WIF节点信息翻译成方位信息的服务器才能;定位快耗电低。
-
PASSIVE_PROVIDER(被迫定位):
被迫定位,运用体系中其他运用的定位信息。
假如咱们开发的 app 运用了定位服务,需求留意:
- 依据运用场景选择定位形式,优先考虑运用网络定位(比如定位城市)
- 前台定位时,界面 onPause 则停止方位更新;后台定位时,依据页务需求操控方位更新时刻间隔。
- 假如运用是多模块开发,模块之间应该尽量复用方位信息,不要一起定位
WakeLock
Android 运转在很多移动设备上,考虑到功耗原因,引入了 autoSleep的休眠办法,当检测到没有唤醒源时就会进入休眠。
假如你想要坚持屏幕常亮,Android引荐如下办法(当Activity或view可见时,屏幕才坚持常亮),下面代码的效果是相同的:
- 在Activity.onCreate()中:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
- 在xml布局中:
android:keepScreenOn="true"
- 对View设置:
view.setKeepScreenOn(true);
除了上述办法,咱们还能够运用 Wakelock。Wakelock 是阻止体系休眠的接口,咱们能够运用它保存屏幕常亮,代码如下:
val wakeLock: PowerManager.WakeLock =
(getSystemService(Context.POWER_SERVICE) as PowerManager).run {
newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "MyApp::MyWakelockTag").apply {
acquire()
}
}
运用FLAG_KEEP_SCREEN_ON实际就是一个PowerManager.SCREEN_BRIGHT_WAKE_LOCK
等级的WakeLock,它的创建和开释锁都由体系主动管理,愈加便利和安全。假如咱们向上面的代码一样主动运用wakeLock,一定要记得调用wakelock.release()
来开释,最好的做法是要设置超时开释的时刻。
还有一种PowerManager.PARTIAL_WAKE_LOCK
等级的 wakelock,在这种等级下即运用户按Power键(其它等级的 wakelocks,用户按Power键,体系仍是会休眠),体系也不会进入休眠,这种状况一定要特别留意。
这儿还补充一下,AlarmManager内部也利用了WakeLock。它是运用体系层级的闹钟服务(持有WakeLock),用来指定时刻履行使命:
1. 需求精确的定时使命,如闹钟。
2. 非精准确定时使命,能够推延使命使多个使命一起履行而避免频频唤醒体系
3. 网络请求相关的事务不运用AlarmManager
动画
动画相关的例子能够看看大众点评App的短视频耗电量优化实战 – 美团技能团队,写得很好,这儿就列一下需求留意的点:
- 动画履行需求和Activity的生命周期相关,假如Activity退出前台则需求暂停动画的履行:
- onPause之后暂停动画履行,削减CPU耗电;onResume重新开端动画制作
- 当界面的制作和动画比较复杂或许频频,优先运用SurfaceView实现,SurfaceView运用单独的制作线程,避免主线程卡顿
JobScheduler
Job Scheduler作为体系服务运转在体系层面,能够指定运转条件(充电状况、Wifi状况、设备空闲),将收到的使命在合适的时刻、状况一起履行。
厂家设备关于 “灭屏 + WIFI + 充电” 的场景管控最为松懈,主张可延时的使命、数据埋点上报 放到这儿履行。例如:网络请求相关事务放到Job Scheduler履行、一些与特定场景(JobInfo)绑定的使命
UI制作
UI制作方面的优化,网上的文章很多,这儿就列举一些需求留意的点:
- 移除不必要的background,比如window默许或嵌套的background
- onDraw屡次重复制作图画,运用clipRect与drawRect
- onDraw办法内不要new对象,避免频频的GC
- 运用等优化UI布局
- ConstraintLayout代替RelativeLayout、LinearLayout,削减界面测量和布局的次数,优化layout开支
- 削减不必要的infalte,运用变量缓存削减资源加载
- Listview复用convertView,削减资源加载
- 快速滑动列表时,关于图片加载或许网络请求类,在停止滑动才加载数据
- clipPath或许导致CPU、GPU占用过大的问题