Android如何通过代码从后台唤醒自有App?适配10及以上系统版本
Android 10及以上版本后台唤醒App失效解决方案
Android 10(API 级别 29)开始,系统新增了后台应用启动Activity的限制规则,只有满足权限要求或豁免场景的应用才能从后台唤起页面,这是你现有代码在高版本系统失效的核心原因。
你可以按照以下步骤修复问题:
- 第一步:申请悬浮窗权限作为通用豁免条件
该权限是Android官方指定的后台启动Activity豁免权限之一,首先在AndroidManifest.xml中添加权限声明:
该权限需要引导用户手动开启,你可以在App首次启动时引导用户跳转至设置页授权:<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(context)) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + context.getPackageName())); startActivity(intent); } - 第二步:调整启动Activity的代码逻辑
从服务上下文启动Activity必须添加FLAG_ACTIVITY_NEW_TASK标识,同时增加版本适配判断,修改后的代码如下:protected Emitter.Listener onNewEmit = new Emitter.Listener() { @Override public void call(Object... args) { Intent intent = getIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // 高版本先校验悬浮窗权限再启动 if (Settings.canDrawOverlays(YourService.this)) { startActivity(intent); } } else { startActivity(intent); } } }; - 可选适配方案:如果你不方便引导用户开启悬浮窗权限,可以将现有后台服务调整为前台服务,启动服务后5秒内调用
startForeground展示常驻通知,该场景也属于系统豁免后台启动Activity的范围,不需要额外申请悬浮窗权限。
内容的提问来源于stack exchange,提问作者Faizan Ahmad
相关产品推荐
相关产品推荐

