gpt4 book ai didi

android - 从 Android 应用程序安装程序和主屏幕启动应用程序时的 Activity 堆栈排序问题

转载 作者:IT王子 更新时间:2023-10-28 23:43:56 25 4
gpt4 key购买 nike

仅出于测试目的,我允许通过 URL 下载和安装我的应用 APK。在手机上下载后,可以使用 Android 应用安装程序启动它,用户可以选择将其安装到他们的设备上然后运行。

考虑我们是否以上述方式下载并运行应用程序。我的应用程序中的主/启动器 Activity 是登录页面(Activity A)。一旦用户通过身份验证,他们就会被带到应用程序的主要区域,例如。 Activity B。所以现在这个任务的当前 Activity 栈是A > B

然后我按下手机上的主页按钮,然后进入 Android 主屏幕。我通过菜单中的图标重新启动我的应用程序,然后我被带到 Activity A,而不是 Activity B。要么 Activity 堆栈现在是 A > B > A,要么现在有两个单独的任务, Activity 堆栈分别为 A > BA .我想要的是在我重新启动应用程序时返回到 Activity B。在此状态下按回将带我回到 Activity B

这种不良行为只有在我首先通过安装程序打开应用程序时才会发生,而不是在我通过主屏幕/菜单打开应用程序时发生。

我研究了每个机制是如何启动 Activity 的。当我们使用应用安装程序时,我们会看到以下日志:

INFO/ActivityManager(XXXX): Starting activity: Intent { dat=file:///mnt/sdcard/download/[my app].apk cmp=com.android.packageinstaller/.InstallAppProgress (has extras) }
INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=[my package]/[Activity A] }

通过启动器/主屏幕:

INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=[my package]/[Activity A] }

使用安装程序启动时,我们看到它使用标志 0x10000000,但启动启动器时,我们看到它使用 0x10200000。它还使用了一个 Intent 类别。

docs 我们看到标志是:

public static final int FLAG_ACTIVITY_NEW_TASK
Constant Value: 268435456 (0x10000000)

public static final int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
Constant Value: 2097152 (0x00200000)

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 标志(在从启动器启动应用程序时使用)似乎通常会阻止创建新任务(如果已存在),并将恢复上次使用的 Activity 。这是期望的行为。为什么它在这种情况下不起作用?我可以做些什么来确保我的应用程序始终将我返回到上一个 Activity,无论它是否是通过应用程序安装程序/启动器启动的?

如果我使用 singleTask,每当我运行应用程序时,它总是会带我回到主要 Activity (Activity A)(这也是不可取的)。

这是我发现有人遇到类似问题的问题(没有公认的答案):App loses its ability to remember its stack when launched from another application

编辑:在启动器 Activity 的 onCreate() 中检查标志 FLAG_ACTIVITY_BROUGHT_TO_FRONT (如果设置了则完成)似乎可以解决主要症状,但显然根本问题仍然存在。有更完整的修复方法吗?

EDIT2:当您从 Android Market 下载/运行应用程序时,会出现相同的结果,因此上述某些详细信息可能不相关。

最佳答案

添加了antonyt提供的答案:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
// Activity was brought to front and not created,
// Thus finishing this will get us to the last viewed activity
finish();
return;
}

// Regular activity creation code...
}

关于android - 从 Android 应用程序安装程序和主屏幕启动应用程序时的 Activity 堆栈排序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6356467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com