无法在 android 10 \[android Q\] 中启动活动背景

新手上路,请多包涵

我使用 android 10 [android Q, galaxy 10],

我使用android studio 3.3,

使用 AVD,并制作了一个 api 29 [android 10] 虚拟手机。

在虚拟机上,我执行我的应用程序,之后,我启动其他应用程序,如日历、计算器。所以我的应用活动进入后台模式。

当我在 BroadcastReceiver 收到消息时。我调用 startActivity。

在这里,代码 –> public class myReceiver extends BroadcastReceiver {}

 public void onReceive(Context context, Intent intent)
{
        Intent intentRun = new Intent(context, LoginSuccess.class);
        intentRun.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);
        context.startActivity(intentRun);
}

但 LoginSuccess 活动没有出现。 [当我的应用处于后台模式时]

使用相同的代码,当我的应用程序处于前台模式时,LoginSuccess 活动显示得很好。

调用堆栈捕获图像

上图显示了我在广播接收器中调用 startActivity 之前的调用堆栈。

我已阅读 android 10 后台活动问题指南。 [developer.android.com/~~ 一些位置]

在指引线上,

我开始知道如果活动存在于调用堆栈中,它甚至可以在后台模式下启动。

上面的代码,它尝试启动存在于最近调用堆栈中的活动。

为什么 startActivity 调用在后台模式下失败? [也许不会失败,但无论如何都不会激活到前台]

原文由 jongdae lee 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 277
1 个回答

在 Android Q 中,如果您的应用不包含以下链接中列出的异常,则无法从后台自动启动 Activity。

https://developer.android.com/guide/components/activities/background-starts

可能的解决方案:

1- 您可以选择只显示服务通知,然后单击开始等待意图

2-您可以使用全屏意图立即显示您的意图,如其他答案所示并由谷歌建议。

对于全屏intent解决方案,参考官方文档

当用户使用设备时,系统 UI 可能会选择显示提醒通知,而不是启动此 Intent。

3- 要在后台自动启动活动,我认为最可能的解决方案是将“SYSTEM_ALERT_WINDOW”添加到清单文件。并在应用程序首次打开时请求用户许可一次。 (用户可以手动授予此权限-(设置-应用程序-您的应用程序-高级-绘制其他应用程序))

请求权限的示例代码:

在清单中:

     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

某处在应用程序:

  public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE= 2323;

//if the user already granted the permission or the API is below Android 10 no need to ask for permission

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q &&
 !Settings.canDrawOverlays(getContext()))
                    {RequestPermission()}

 private void RequestPermission() {
            // Check if Android M or higher
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                // Show alert dialog to the user saying a separate permission is needed
                // Launch the settings activity if the user prefers
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                        Uri.parse("package:" + getActivity().getPackageName()));
                startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
            }
        }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (!Settings.canDrawOverlays(getContext())) {
                    PermissionDenied();
                }
                else
                {
                 // Permission Granted-System will work
            }

        }
    }
 }

原文由 Eren Tüfekçi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题