赞
踩
目录
最近需要开发一个某些时候需要把app唤醒并置于前台的功能。刚开发时,在模拟器正常,后来上真机出问题了。进行排查发现模拟器api是28的,真机是api29(Android 10),查资料发现,api29版本禁止后台启动activity,而造成的。
具体资料如下:
从官方文档得知,在一些情况下,可以允许从后台启动Activity,具体如下:
在 Android 10 或更高版本上运行的应用只有在满足以下一项或多项条件时,才能启动 Activity:
应用在 Recents 屏幕上现有任务的返回栈中拥有 Activity。
注意:当此类应用尝试启动新的 Activity 时,系统会将该 Activity 放置到应用现有任务的顶部,但不会离开当前可见的任务。当用户稍后返回应用任务时,系统会启动新的 Activity,而不是之前放置在应用任务顶部的 Activity。
应用的某个 Activity 刚在不久前启动。
应用最近为某个 Activity 调用了 finish()
。这仅适用于在调用 finish()
时,应用在前台或前台任务的返回栈中拥有 Activity 的情况。
应用具有受系统约束的服务。此情况仅适用于以下服务,这些服务可能需要启动界面:AccessibilityService
、AutofillService
、CallRedirectionService
、HostApduService
、InCallService
、TileService
、VoiceInteractionService
和 VrListenerService
。
应用中的某个服务受另一个可见应用约束。请注意,绑定到服务的应用必须保持可见,以便后台应用成功启动 Activity。
应用收到系统的 PendingIntent
通知。对于服务和广播接收器的挂起 Intent,应用可在该挂起 Intent 发送几秒钟后启动 Activity。
应用收到另一个可见应用发送的 PendingIntent
。
应用收到它应该在其中启动界面的系统广播。示例包括 ACTION_NEW_OUTGOING_CALL
和 SECRET_CODE_ACTION
。应用可在广播发送几秒钟后启动 Activity。
应用通过 CompanionDeviceManager
API 与配套硬件设备相关联。此 API 支持应用启动 API,以响应用户在配对设备上执行的操作。
用户已向应用授予 SYSTEM_ALERT_WINDOW
权限。
通过让用户授权SYSTEM_ALERT_WINDOW
权限,既悬浮窗权限即可。
<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);
- }
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
- if(!(checkFloatPermission(this))){
- Toast.makeText(getApplicationContext(),"请给软件设置悬浮窗权限,否则无法正常使用!",Toast.LENGTH_SHORT).show();
- Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
- startActivity(intent);
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。