仅出于测试目的,我允许通过 URL 下载和安装我的应用程序 APK。一旦下载到手机上,它就可以通过 Android 应用程序安装程序启动,用户可以选择将其安装到设备上然后运行。
考虑一下我们是否以上述方式下载并运行应用程序。我的应用程序中的主要/启动器活动是登录页面(Activity A
)。一旦用户通过身份验证,他们就会被带到应用程序的主要区域,例如Activity B
。所以现在这个任务的当前活动堆栈是A > B
.
然后我按下手机上的主页按钮,进入 Android 主屏幕。我通过菜单中的图标重新启动我的应用程序,然后我被带到Activity A
, 代替Activity B
。活动堆栈现在是A > B > A
,或者现在有两个带有活动堆栈的独立任务A > B
, and 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
(从启动器启动应用程序时使用)似乎通常会阻止创建新任务(如果已经存在),并且会恢复上次使用的活动。这是期望的行为。为什么在这种情况下它不起作用?我可以做些什么来确保我的应用程序始终将我返回到上一个活动,无论它是否是通过应用程序安装程序/启动器启动的?
如果我使用singleTask
它总是会带我回到主要活动(Activity A
)每当我运行应用程序时(这也是不可取的)。
这是我发现有人遇到类似问题的问题(没有可接受的答案):从另一个应用程序启动时,应用程序将失去记住其堆栈的能力
编辑:检查标志FLAG_ACTIVITY_BROUGHT_TO_FRONT
in onCreate()
我们的启动器活动(如果已设置,则完成)似乎解决了主要症状,但显然根本问题仍然存在。有更完整的修复吗?
EDIT2:当您从 Android Market 下载/运行应用程序时,会出现相同的结果,因此上述某些详细信息可能不相关。