15

在我的 Android 应用程序中,我有一个主要活动作为我的应用程序的入口点,它在我的清单文件中配置,如下所示:

<activity android:name=".Main"
              android:label="@string/app_name"
              android:screenOrientation="portrait"
              android:alwaysRetainTaskState="true"
              android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

因此,对于特定的用例,假设用户通过单击应用程序启动器内的图标从主屏幕启动应用程序。启动应用程序后,用户从主活动导航到活动 A,然后最终导航到活动 B。此时,用户决定查看他们的 facebook,因此他们单击主页按钮将我的应用程序置于后台,然后启动脸书应用程序。

在查看了他们的 facebook 之后,用户想要返回我的应用程序,所以他们按下 home 键,然后从应用程序启动器启动应用程序(就像他们第一次启动它时所做的那样)。

当用户返回我的应用程序时,我希望应用程序返回到应用程序进入后台时用户所处的最后一个活动,在本例中是活动 B。在清单文件中,我设置了 alwaysRetainTaskState=true以确保操作系统不会杀死我的应用程序的活动。

现在我的问题是:我如何得到我上面描述的行为?每当我单击我的应用程序的图标时,它总是从主活动开始,无论如何。我认为这是因为 category.LAUNCHER 属性。我已经尝试过 android:launchMode=singleTask,但并没有什么不同;它总是从 Main 开始。

如果有人能澄清意图过滤器、启动模式和任务,那就太好了!

4

3 回答 3

9

FYIsingleTask不是您想要的,因为它启动了一项新任务:

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

你是如何启动活动 B 的?任何非标准的启动模式或意图标志?

于 2010-01-13T19:12:46.157 回答
7

对于任何来到这里遇到类似问题的人,我发现了一些奇怪的东西,可能就是你所看到的......也许。

假设我有一个带有活动 A -> B -> C 等的应用程序。如果我的应用程序从应用程序列表(即启动器)启动,我的应用程序总是“恢复”到 A 时遇到问题。从“重新发送”屏幕恢复(长按主页)会表现出正确的恢复行为(按预期恢复到 B 或 C)。我的清单没什么特别的,我总是在我的根活动中设置RetainTaskState="true",并且启动模式是默认(标准)。

我正在通过网站将 apk 加载到我的手机上。下载并安装后,我会按“打开”立即启动该应用程序。出于某种原因(卸载应用程序后)我厌倦了再次下载、安装,但后来我按下了“完成”按钮。然后从启动器/“所有应用程序”列表启动应用程序具有与从最近恢复相同的恢复行为 - 换句话说,我的问题是由于单击“打开”而不是“完成”时的安装过程而引起的。

我在 API10 (2.3.5) 和 API15 (4.0.4) 上验证了这个“解决方案”

于 2012-11-05T10:36:57.233 回答
3

我通过添加无屏幕DispatcherActivity并将其设为默认值(通过使用完全相同的意图过滤器)解决了这个问题。在它的onCreate方法中,您可以基于一些合理的默认值(例如您的 Main 活动)或基于一些保存的标识应该启动哪个 Activity 的令牌来创建和调用 Intent。onStop该令牌在您要在重新启动时调用的任何 Activity的方法中保存/刷新。您可以将此令牌保存到首选项。

这里的理由是,最后一个可见的活动将在中断时执行 onStop 方法。

这里要注意的是:我确实实现了这种模式,并且效果相当好。然而,它似乎不太适合历史,最后我放弃了并将这段代码拉出来。到目前为止没有人抱怨。

于 2010-01-13T19:10:17.817 回答