在运用开发中,耗电是咱们需求重视的要点。但是,开端进行耗电优化时,咱们常常感到无从下手。这篇文章将介绍耗电优化的相关要点,让咱们优化时有一个方向。

传感器

大多数Android设备都内置传感器,假如你的 App 需求运用传感器,记得在不运用时及时撤销注册监听,否则会让 app 在后台一直接纳数据,形成不必要的耗电。

Android耗电优化需要注意的要点

如上图,谷歌官方文档上写的很清楚。当咱们在Activity切到后台后依然会调用传感器,一般来说onPause之后就现已是非事务场景,在 destroy之前都会继续占用传感器,形成不必要的耗电。

其次,注册传感器时,能够选择传感器精度,精度越高耗电也就越多,咱们需求依据事务实际需求选择合适的精度,不要盲目寻求高精度。

定位

定位从获取办法能够分为两种,主动获取 或 被迫定位。主动获取又能够分为 GPS 和 网络定位。

  • GPS_PROVIDER(GPS办法):

    1. GPS定位,精准度高耗电量大;
    2. 室内GPS定位基本没用。
    3. 绝大部分用户默许不敞开GPS模块;
    4. 从GPS模块启动到获取第一次定位数据,或许需求比较长的时刻;
  • NETWORK_PROVIDER(网络定位):

    网络定位,利用基站和WIFI节点的地址来定位,取决于将基站或WIF节点信息翻译成方位信息的服务器才能;定位快耗电低。

  • PASSIVE_PROVIDER(被迫定位):

    被迫定位,运用体系中其他运用的定位信息。

假如咱们开发的 app 运用了定位服务,需求留意:

  1. 依据运用场景选择定位形式,优先考虑运用网络定位(比如定位城市)
  2. 前台定位时,界面 onPause 则停止方位更新;后台定位时,依据页务需求操控方位更新时刻间隔。
  3. 假如运用是多模块开发,模块之间应该尽量复用方位信息,不要一起定位

WakeLock

Android 运转在很多移动设备上,考虑到功耗原因,引入了 autoSleep的休眠办法,当检测到没有唤醒源时就会进入休眠。

假如你想要坚持屏幕常亮,Android引荐如下办法(当Activity或view可见时,屏幕才坚持常亮),下面代码的效果是相同的:

  1. 在Activity.onCreate()中: getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  2. 在xml布局中: android:keepScreenOn="true"
  3. 对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的短视频耗电量优化实战 – 美团技能团队,写得很好,这儿就列一下需求留意的点:

  1. 动画履行需求和Activity的生命周期相关,假如Activity退出前台则需求暂停动画的履行:
  2. onPause之后暂停动画履行,削减CPU耗电;onResume重新开端动画制作
  3. 当界面的制作和动画比较复杂或许频频,优先运用SurfaceView实现,SurfaceView运用单独的制作线程,避免主线程卡顿

JobScheduler

Job Scheduler作为体系服务运转在体系层面,能够指定运转条件(充电状况、Wifi状况、设备空闲),将收到的使命在合适的时刻、状况一起履行。

厂家设备关于 “灭屏 + WIFI + 充电” 的场景管控最为松懈,主张可延时的使命、数据埋点上报 放到这儿履行。例如:网络请求相关事务放到Job Scheduler履行、一些与特定场景(JobInfo)绑定的使命

UI制作

UI制作方面的优化,网上的文章很多,这儿就列举一些需求留意的点:

  1. 移除不必要的background,比如window默许或嵌套的background
  2. onDraw屡次重复制作图画,运用clipRect与drawRect
  3. onDraw办法内不要new对象,避免频频的GC
  4. 运用等优化UI布局
  5. ConstraintLayout代替RelativeLayout、LinearLayout,削减界面测量和布局的次数,优化layout开支
  6. 削减不必要的infalte,运用变量缓存削减资源加载
  7. Listview复用convertView,削减资源加载
  8. 快速滑动列表时,关于图片加载或许网络请求类,在停止滑动才加载数据
  9. clipPath或许导致CPU、GPU占用过大的问题