「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战」
Android 忽略电池优化
由于有些产品本身需要长时间定位、长时间的后台运行,即使锁屏之后还需要保证任务的正常运行,随着安卓系统的升级,权限的收紧,这个场景变得越来越困难,很多开发者都为此苦恼,特别咱还是一些小厂,拿不到厂商的白名单,就更难受了。
保活怎么做
现在的保活不像以前,需要用很多黑科技来帮助我们实现,比如1像素技术、双进程守护,而现在的保活需要遵循谷歌官方文档的资料来进行,更多的反而是放在用户端了。
比如安卓官方文档在后台限制中是这么说的:
在后台中运行的 Service 会消耗设备资源,这可能会降低用户体验。 为了缓解这一问题,系统对这些 Service 施加了一些限制。
如果满足以下任意条件,应用将被视为处于前台:
具有可见 Activity(不管该 Activity 已启动还是已暂停)。
具有前台 Service。
另一个前台应用已关联到该应用(不管是通过绑定到其中一个 Service,还是通过使用其中一个内容提供程序)。 例如,如果另一个应用绑定到该应用的 Service,那么该应用处于前台:
IME(输入法)
壁纸 Service
通知侦听器
语音或文本 Service
如果以上条件均不满足,应用将被视为处于后台。
所以根据以上条件,开发者们想出来了的保活方案
- 前台服务
- 后台播放无声音乐
- 傀儡通知
即使开发者做到以上功能,也不能保证应用就能存活,因为保活和省电不能兼得。
现在的保活想要做的比较好,还需要从用户层面进行考虑。 比如:
- 忽略电池优化
- 允许自启动
- 手机管家app的白名单
忽略电池优化
默认的程序是允许电池优化的,优化的目的就是防止程序在后台偷偷的耗电,我们也见过部分应用有下面的这个功能。
这就是在向用户申请忽略电池优化,当用户进行允许后,可以适当的延长应用的存活时间。这样就不需要用户在应用和通知->高级->特殊应用权限->电池优化中找到该应用忽略电池优化这种繁琐的步骤了。
如何使用呢?
- 在AndroidManifest.xml 中申请权限,不需要动态权限。
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
- 申请忽略电池优化
@RequiresApi(api = Build.VERSION_CODES.M)
public void requestIgnoreBatteryOptimizations() {
try {
Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
- 判断是否开启电池优化
@RequiresApi(api = Build.VERSION_CODES.M)
private boolean isIgnoringBatteryOptimizations() {
boolean isIgnoring = false;
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (powerManager != null) {
isIgnoring = powerManager.isIgnoringBatteryOptimizations(getPackageName());
}
return isIgnoring;
}
这样就完成啦。