【发布时间】:2011-09-15 10:26:30
【问题描述】:
仅出于测试目的,我允许通过 URL 下载和安装我的应用 APK。在手机上下载后,可以使用 Android 应用安装程序启动它,用户可以选择将其安装到他们的设备上然后运行。
考虑我们是否以上述方式下载并运行应用程序。我的应用程序中的主/启动器活动是登录页面 (Activity A)。一旦用户通过身份验证,他们就会被带到应用程序的主要区域,例如。 Activity B。所以现在这个任务的当前活动栈是A > B。
然后我按下手机上的主页按钮,然后进入 Android 主屏幕。我通过菜单中的图标重新启动我的应用程序,我被带到Activity A,而不是Activity B。要么活动堆栈现在是A > B > A,要么现在有两个单独的任务,活动堆栈分别为A > B 和A。我想要的是在我重新启动应用程序时回到Activity B。在这种状态下按回将带我回到Activity B。
这种不良行为只有在我首先通过安装程序打开应用程序时才会发生,而不是在我通过主屏幕/菜单打开应用程序时发生。
我研究了每个机制是如何启动活动的。当我们使用应用安装程序时,我们会看到以下日志:
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。它还使用了一个意图类别。
从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,无论它是否是通过应用程序安装程序/启动器启动的?
如果我使用singleTask,每当我运行应用程序时,它总是会带我回到主要活动 (Activity A)(这也是不可取的)。
这是我发现有人遇到类似问题的问题(没有公认的答案):App loses its ability to remember its stack when launched from another application
编辑:在我们的启动器活动的onCreate() 中检查标志FLAG_ACTIVITY_BROUGHT_TO_FRONT(如果已设置,则完成)似乎可以解决主要症状,但显然根本问题仍然存在。有更完整的修复方法吗?
EDIT2:当您从 Android Market 下载/运行应用程序时,会出现相同的结果,因此上述某些详细信息可能不相关。
【问题讨论】:
-
检查 FLAG_ACTIVITY_BROUGHT_TO_FRONT 效果很好。您可以将其发布为答案吗?
-
另一个可重现的场景:从市场应用启动应用
-
和stackoverflow.com/a/16447508/769265的情况基本一样,2019年还在破!
标签: android android-activity android-intent task flags