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

2023-12-24

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

我用的是android studio 3.3,

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

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

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

在这里,代码--> 公共类 myReceiver 扩展了 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 活动显示得很好 当我的应用程序处于前台模式时。

调用堆栈捕获图像 https://i.stack.imgur.com/tPJeD.png

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

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

在指导线上,

我才知道 如果该活动存在于调用堆栈中,则可以启动它 即使在后台模式下。

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

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


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

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

可能的解决方案:

1-您可以选择仅显示服务通知,然后单击即可启动待处理意图

2-您可以使用全屏意图立即显示您的意图,如其他答案所示和 Google 建议的那样。

对于全屏intent解决方案,如官方文档所述

系统 UI 可以选择显示抬头通知,而不是 当用户使用设备时启动此意图。

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
            }

        }
    }
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 android 10 中启动活动背景 [ android Q ] 的相关文章

随机推荐