-
Notifications
You must be signed in to change notification settings - Fork 0
Start in Background Permission
panwj edited this page Sep 16, 2019
·
10 revisions
在小米手机的应用权限管理中有一个“后台弹出界面权限”,该项权限会限制当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();
}
}
}经过测试,android 10的设置中没有找到start in background权限的设置开关,但是在android 10上后台是不能启动activity的,以上提供的判断start in background权限是否开启,目前只适用与小米,那么android 10设备怎么做才能在后台启动activity呢?