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

问题描述

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

解决方法

        添加了anantyt提供的答案:
@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...
}
    ,        我认为潜在的问题是,启动器和安装程序使用的ѭ21有所不同。就获得不同的Intent标志而言,您将获得不同的启动行为。您可以对启动模式进行修改,也许可以获得一致的结果,但是从根本上说,这些不同的Intent将产生不同的结果。 您的解决方法(或类似方法)可能是您最好的选择。     ,        您的问题很可能是因为应用程序安装程序不像启动程序那样使用LAUNCHER类别。 该错误已在其他地方记录: 应用程序始终从root活动开始重新启动,而不是恢复后台状态(已知错误)