电量的插曲

188 阅读3分钟

最近一次打车,师傅说某个打车软件特别费电,就开启了绿色省电模式,过了一段时间后然后又吐槽软件不准确。经常延迟指路,对新手师傅不友好;事后我想了下,有可能耗电量引起的蝴蝶效应

为什么会耗电

CPU 和GPU 进程不停的工作

怎么避免耗电

  1. 减少操作:如进行网络优化
  2. 延迟操作:判断电量,等电量充足的时候再去操作
  3. 减少接口调用;

Android 手机省电的

Android 从6.0 开始提供两种省电模式Doze和Standby

Doze

设备在未充电,屏幕熄灭的,在一段时间内保持不活动状态。整个活动顺序如下

  1. 低电耗进入Doze 模式,不进行网络活动,延迟作业,
  2. 一段时间后 进入 maintenance window,开始进行网络活动和需要的作业
  3. 连接充电,屏幕点亮 退出Doze 模式

在Doze 模式 下受限操作如下:

  • 暂停访问网络
  • Wake Locks被忽略
  • AlarmManager闹铃会被推迟到下一个 maintenance window 响应
  • 系统不执行Wi-Fi/GPS扫描
  • 系统不允许同步适配器运行
  • 系统不允许JobScheduler运行

Standby

应用待机模式允许系统判定应用在用户未主动使用它时是否处于闲置状态。当用户有一段时间未触摸应用时,系统便会作出此以下条件判定:

  1. 用户明确启动应用。
  2. 应用当前有一个进程在前台运行(作为活动或前台服务,或者正在由其他活动或前台服务使用)。
  3. 应用生成用户可在锁定屏幕或通知栏中看到的通知。

如果这些操作全都没有,手机就会进入闲置模式,不再进行待机模式,不进行网络调用等操作,如果闲置时间较长,系统允许应用访问网络,频率大概是每天一次

逃避Doze和Standby-白名单

Android 系统提供了可以免除部分Doze和Standby 的限制的白名单,可以在设置中的电池优化手动配置白名单,另外系统也提供了相应的函数调用去申请白名单:

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

// 弹窗模式让用户选择加入白名单的应用,也可以跳转到设置白名单后让用户自己设置
 Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
 intent.setData(Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);

加入到白名单后可以使用网络,部分唤醒锁定;但是还有一部分功能还是有被限制比如作业和同步会延迟 ,AlarmManager闹铃不会触发等

检测电量使用-Energy Profiler

Android 8.0 开始,-Energy Profiler可以了解应用在哪里耗用了不必要的电量,ta会监控cpu,网络,无线装置,Gps传感器的使用情况,并直观的显示其中某个组件消耗电量的情况和可能影响电量的系统事件 image.png

Energy Profiler的默认视图包括以下时间轴:

  1. Event时间轴:显示应用程序中的活动在其生命周期中不同状态之间的转换。此时间轴还指示用户与设备的交互,包括屏幕旋转事件。
  2. Energy时间轴:显示应用程序的估计能耗。
  3. System时间轴:表示可能影响能耗的系统事件。

要查看CPU、网络和位置(GPS)资源以及相关系统事件的能源使用明细,请将鼠标指针放在Energy时间轴中的一个条上。

总结

根据应用的特性,和相关页面业务需求,申请白名单让我们的应用更加稳定