关于安卓保活问题

关于我的保活问题无非是在后台长时间运行,不在用户主动结束App的情况下可以一直活下去,当然是在不结束进程的情况下,如果你确实需要后台推送,在app被杀死的情况下后也可以收到消息的话,你可以引导用户去开启自启动权限!关于我说的这些下面都会有叙述。

整体思路

根据我的搜索加上我的实践所得:整体分为两步到3步操作。
为什么会这么说呢,因为我测试了三款手机,OPPO的一款(Android9),vivo的一款(Android10),小米的一款(Android10),OV这两款手机是电池优化权限和后台运行权限进行一步就可以,而小米的这款是需要两种权限同时手动开启。
更为无语的就是自启动权限,根据各方大佬的帖子说国内安卓手机没有开放这个接口。

  1. 电池优化权限 ,引导用户去做电池优化权限;

android service 保活 android10保活_app


android service 保活 android10保活_app_02

// 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);
    }
  1. 后台运行权限 ,弹窗让用户去做处理;

android service 保活 android10保活_app_03

// 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();
        }
    }
  1. 自启动权限 ,引导用户去做电池优化权限;

android service 保活 android10保活_安卓_04

android service 保活 android10保活_android_05

android service 保活 android10保活_android_06

// 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;
    }
  1. 下面是我参考各位前辈的博客,我的只是有需要的地方修改了,再次感谢下面两位

参考链接:

  1. Android 后台运行白名单,优雅实现保活 - 简书.
    2.Android引导用户开启自启动权限 - 简书 .