目录
过程分析
解决方案
在AndroidManifest.xml上添加权限
检查是否开启悬浮窗权限
打开悬浮窗权限设置页
????????最近需要开发一个某些时候需要把app唤醒并置于前台的功能。刚开发时,在模拟器正常,后来上真机出问题了。进行排查发现模拟器api是28的,真机是api29(Android 10),查资料发现,api29版本禁止后台启动activity,而造成的。
过程分析
具体资料如下:
从后台启动 Activity 的限制
Android10(Api 29)新特性适配小结
从官方文档得知,在一些情况下,可以允许从后台启动Activity,具体如下:
在 Android?10 或更高版本上运行的应用只有在满足以下一项或多项条件时,才能启动 Activity:
解决方案
? ? ? ? 通过让用户授权SYSTEM_ALERT_WINDOW ?权限,既悬浮窗权限即可。
-
在AndroidManifest.xml上添加权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
代码摘自
Android悬浮窗权限“android.permission.SYSTEM_ALERT_WINDOW”判断是否开启问题
public static boolean checkFloatPermission(Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)//4.4-5.1
return true;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {//6.0
try {
Class cls = Class.forName("android.content.Context");
Field declaredField = cls.getDeclaredField("APP_OPS_SERVICE");
declaredField.setAccessible(true);
Object obj = declaredField.get(cls);
if (!(obj instanceof String)) {
return false;
}
String str2 = (String) obj;
obj = cls.getMethod("getSystemService", String.class).invoke(context, str2);
cls = Class.forName("android.app.AppOpsManager");
Field declaredField2 = cls.getDeclaredField("MODE_ALLOWED");
declaredField2.setAccessible(true);
Method checkOp = cls.getMethod("checkOp", Integer.TYPE, Integer.TYPE, String.class);
int result = (Integer) checkOp.invoke(obj, 24, Binder.getCallingUid(), context.getPackageName());
return result == declaredField2.getInt(cls);
} catch (Exception e) {
return false;
}
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//8
AppOpsManager appOpsMgr = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
if (appOpsMgr == null)
return false;
int mode = appOpsMgr.checkOpNoThrow("android:system_alert_window", android.os.Process.myUid(), context
.getPackageName());
return Settings.canDrawOverlays(context) || mode == AppOpsManager.MODE_ALLOWED || mode == AppOpsManager.MODE_IGNORED;
} else {
return Settings.canDrawOverlays(context);
}
}
}
if(!(checkFloatPermission(this))){
Toast.makeText(getApplicationContext(),"请给软件设置悬浮窗权限,否则无法正常使用!",Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivity(intent);
}
|