安卓一个永恒的话题“进程保活”,想要仅仅从代码层面让你的app保活,基本是不可能的,必须还要配合很多用户的操作。当然能编译系统源码的大佬就当我没说。而代码层面要做的事也很多,什么startForeground,传说中的1像素大法,双service互相拉起,还有就是本文要说的针对安卓6.0之后要做的一件事,忽略电池优化,也有叫添加电池优化白名单。做法很简单,就两步:
一、声明权限
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
二、添加申请代码
public void ignoreBatteryOptimization(Activity activity) {
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
// 判断当前APP是否有加入电池优化的白名单,如果没有,弹出加入电池优化的白名单的设置对话框。
if (!powerManager.isIgnoringBatteryOptimizations(activity.getPackageName()))
{
Intent intent = new
Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + activity.getPackageName()));
//跳转之前判断intent是否存在,否则有的机型会报找不到activity
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, BATTERY_REQUEST);
}else{
//TODO
}
} else {
//TODO
}
} else {
//TODO
}
}
需要注意的是其中跳转之前intent.resolveActivity(getPackageManager()) != null这个判断不能忘了,因为并不是所有的6.0系统都有这么个功能,如果不加这一句,有的机型就会报找不到activity,报错,闪退,很危险。关于resolveActivity大家可以百度下,还有其它替代方法。我也是因为上线后客户反馈才加上这句的,所以记录下。