Skip to content

Start in Background Permission

panwj edited this page Sep 16, 2019 · 10 revisions

关于start in background 权限问题

关于小米手机后台弹activity

在小米手机的应用权限管理中有一个“后台弹出界面权限”,该项权限会限制当APP处在后台时弹出Activity的动作,该权限在某些机型上是默认关闭的, 如果不给权限的情况下在后台启动activity,会无反应,且在日志中会有 ‘ExtraActivityManagerService: MIUILOG- Permission Denied Activity’提示

小米机型解决方案

我们可以判断是否开起了start in background权限,如果没有开启,跳转到相应的界面进行授权,这时需要注意一个问题,小米的有些机型start in background权限授予界面是单独的一个页面,有的则是在应用详情页面,所以,对于跳转授权的页面我们需要适配一下, 具体如下:

判断是否授予start in background的方法如下:
public static boolean canBackgroundStart(Context context) {
        try {
            AppOpsManager ops = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
            int op = 10021; // >= 23
            // ops.checkOpNoThrow(op, uid, packageName)
            Method method = ops.getClass().getMethod("checkOpNoThrow", new Class[]
                    {int.class, int.class, String.class}
            );
            Integer result = (Integer) method.invoke(ops, op, android.os.Process.myUid(), context.getPackageName());
            return result == AppOpsManager.MODE_ALLOWED;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }

跳转到相应授权界面的方法如下:

private void openOpsSettings() {
        try {
            if (DeviceUtils.isMIUI() && !PermissionHelper.canBackgroundStart(getApplicationContext())) {
                try {
                    Intent intent = new Intent();
                    intent.setAction("miui.intent.action.APP_PERM_EDITOR");
                    intent.addCategory(Intent.CATEGORY_DEFAULT);
                    intent.putExtra("extra_pkgname",  getApplicationContext().getPackageName());
                    this.startActivityForResult(intent, REQUEST_DRAW_CODE);
                } catch (Exception e) {
                    e.printStackTrace();
                    if (!PermissionHelper.isHoldAlertWindowPermission(getApplicationContext())) {
                        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                                Uri.parse("package:" + getApplicationContext().getPackageName()));
                        this.startActivityForResult(intent, REQUEST_DRAW_CODE);
                        return;
                    } else {
                        SharedPreferencesUtil.put(getApplicationContext(), Constants.PREF_UPDATE_GUIDE_FLOAT_KEY, false);
                    }
                }
                return;
            }

            if (!PermissionHelper.isHoldAlertWindowPermission(getApplicationContext())) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                        Uri.parse("package:" + getApplicationContext().getPackageName()));
                this.startActivityForResult(intent, REQUEST_DRAW_CODE);
                return;
            } else {
                SharedPreferencesUtil.put(getApplicationContext(), Constants.PREF_UPDATE_GUIDE_FLOAT_KEY, false);
            }

            if (!PermissionHelper.canBackgroundStart(getApplicationContext())) {
                Intent intent = new Intent();
                intent.setAction("miui.intent.action.APP_PERM_EDITOR");
                intent.addCategory(Intent.CATEGORY_DEFAULT);
                intent.putExtra("extra_pkgname",  getApplicationContext().getPackageName());
                this.startActivityForResult(intent, REQUEST_DRAW_CODE);
            }
        } catch (Exception e) {
            try {
                Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null);
                intent.setData(uri);
                this.startActivityForResult(intent, REQUEST_DRAW_CODE);
            } catch (Exception e1) {
                e.printStackTrace();
            }
        }
    }

Clone this wiki locally