关于安卓保活问题
关于我的保活问题无非是在后台长时间运行,不在用户主动结束App的情况下可以一直活下去,当然是在不结束进程的情况下,如果你确实需要后台推送,在app被杀死的情况下后也可以收到消息的话,你可以引导用户去开启自启动权限!关于我说的这些下面都会有叙述。
整体思路
根据我的搜索加上我的实践所得:整体分为两步到3步操作。
为什么会这么说呢,因为我测试了三款手机,OPPO的一款(Android9),vivo的一款(Android10),小米的一款(Android10),OV这两款手机是电池优化权限和后台运行权限进行一步就可以,而小米的这款是需要两种权限同时手动开启。
更为无语的就是自启动权限,根据各方大佬的帖子说国内安卓手机没有开放这个接口。
- 电池优化权限 ,引导用户去做电池优化权限;
// code 当然你要在适合的地方或者你需要的地方去调用他们
/**
* 是否在白名单内
* @param context
* @return
*/
@SuppressLint("LongLogTag")
@RequiresApi(api = Build.VERSION_CODES.M)
private boolean isSystemWhiteList(Context context) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
String packageName = context.getPackageName();
boolean isWhite = pm.isIgnoringBatteryOptimizations(packageName);
Log.e("jk SystemUtil", "SystemUtil.isSystemWhiteList.packageName=" + packageName + ",isWhite=" + isWhite);
return isWhite;
}
@RequiresApi(api = Build.VERSION_CODES.M)
private void startSetting() {
if (isHuawei()) {
goHuaweiSetting();
} else if (isXiaomi()) {
goXiaomiSetting();
} else if (isOPPO()) {
goOPPOSetting();
} else if (isVIVO()) {
goVIVOSetting();
} else if (isMeizu()) {
goMeizuSetting();
} else if (isSamsung()) {
goSamsungSetting();
} else if (isLeTV()) {
goLetvSetting();
} else if (isSmartisan()) {
goSmartisanSetting();
}
}
private boolean isHuawei() {
if (Build.BRAND == null) {
return false;
} else {
return Build.BRAND.toLowerCase().equals("huawei") || Build.BRAND.toLowerCase().equals("honor");
}
}
private void goHuaweiSetting() {
try {
showActivity("com.huawei.systemmanager",
"com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity");
} catch (Exception e) {
showActivity("com.huawei.systemmanager",
"com.huawei.systemmanager.optimize.bootstart.BootStartActivity");
}
}
private boolean isXiaomi() {
return Build.BRAND != null && Build.BRAND.toLowerCase().equals("xiaomi");
}
private void goXiaomiSetting() {
showActivity("com.miui.securitycenter",
"com.miui.permcenter.autostart.AutoStartManagementActivity");
}
private static boolean isOPPO() {
return Build.BRAND != null && Build.BRAND.toLowerCase().equals("oppo");
}
private void goOPPOSetting() {
try {
showActivity("com.coloros.phonemanager");
} catch (Exception e1) {
try {
showActivity("com.oppo.safe");
} catch (Exception e2) {
try {
showActivity("com.coloros.oppoguardelf");
} catch (Exception e3) {
showActivity("com.coloros.safecenter");
}
}
}
}
private static boolean isVIVO() {
return Build.BRAND != null && Build.BRAND.toLowerCase().equals("vivo");
}
private void goVIVOSetting() {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = ComponentName.unflattenFromString("com.android.settings/.Settings$HighPowerApplicationsActivity");
intent.setComponent(cn);
startActivity(intent);
}
private boolean isMeizu() {
return Build.BRAND != null && Build.BRAND.toLowerCase().equals("meizu");
}
private void goMeizuSetting() {
showActivity("com.meizu.safe");
}
private boolean isSamsung() {
return Build.BRAND != null && Build.BRAND.toLowerCase().equals("samsung");
}
private void goSamsungSetting() {
try {
showActivity("com.samsung.android.sm_cn");
} catch (Exception e) {
showActivity("com.samsung.android.sm");
}
}
private boolean isLeTV() {
return Build.BRAND != null && Build.BRAND.toLowerCase().equals("letv");
}
private void goLetvSetting() {
showActivity("com.letv.android.letvsafe",
"com.letv.android.letvsafe.AutobootManageActivity");
}
private boolean isSmartisan() {
return Build.BRAND != null && Build.BRAND.toLowerCase().equals("smartisan");
}
private void goSmartisanSetting() {
showActivity("com.smartisanos.security");
}
/**
* 跳转到指定应用的首页
*/
private void showActivity(@NonNull String packageName) {
Intent intent = getPackageManager().getLaunchIntentForPackage(packageName);
startActivity(intent);
}
/**
* 跳转到指定应用的指定页面
*/
private void showActivity(@NonNull String packageName, @NonNull String activityDir) {
Intent intent = new Intent();
intent.setComponent(new ComponentName(packageName, activityDir));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
- 后台运行权限 ,弹窗让用户去做处理;
// code
/**
* 下面俩是申请后台运行的
* @return
*/
@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;
}
@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();
}
}
- 自启动权限 ,引导用户去做电池优化权限;
// code
private void gotoAutoActivity(Context context) {
Intent autostartSettingIntent;
try {
autostartSettingIntent = getAutostartSettingIntent(context);
startActivity(autostartSettingIntent);
} catch (Exception e) {
e.printStackTrace();
autostartSettingIntent = new Intent(Settings.ACTION_SETTINGS);
context.startActivity(autostartSettingIntent);
}
}
/**
* 获取自启动管理页面的Intent
* @param context context
* @return 返回自启动管理页面的Intent
*/
public static Intent getAutostartSettingIntent(Context context) {
ComponentName componentName = null;
String brand = Build.MANUFACTURER;
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
switch (brand.toLowerCase()) {
case "samsung"://三星
componentName = new ComponentName("com.samsung.android.sm", "com.samsung.android.sm.app.dashboard.SmartManagerDashBoardActivity");
break;
case "huawei"://华为
componentName = new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity");
break;
case "xiaomi"://小米 mix3测试通过
componentName = new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity");
break;
case "vivo"://vivo z5测试通过
if (Build.VERSION.SDK_INT >= 23) {
componentName = new ComponentName("com.vivo.permissionmanager",
"com.vivo.permissionmanager.activity.PurviewTabActivity");
} else {
componentName = new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.SoftwareManagerActivity");
}
break;
case "oppo"://OPPO Android9的一台设备通过
componentName = new ComponentName("com.coloros.oppoguardelf", "com.coloros.powermanager.fuelgaue.PowerUsageModelActivity");
break;
case "yulong":
case "360"://360
componentName = new ComponentName("com.yulong.android.coolsafe", "com.yulong.android.coolsafe.ui.activity.autorun.AutoRunListActivity");
break;
case "meizu"://魅族
componentName = new ComponentName("com.meizu.safe", "com.meizu.safe.permission.SmartBGActivity");
break;
case "oneplus"://一加
componentName = new ComponentName("com.oneplus.security", "com.oneplus.security.chainlaunch.view.ChainLaunchAppListActivity");
break;
case "letv"://乐视
intent.setAction("com.letv.android.permissionautoboot");
default://其他
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.fromParts("package", context.getPackageName(), null));
break;
}
intent.setComponent(componentName);
return intent;
}
- 下面是我参考各位前辈的博客,我的只是有需要的地方修改了,再次感谢下面两位
参考链接: