使用alwaysRetainTaskState和lauchMode保留android应用程序状态

jli*_*lim 14 java android manifest filter android-intent

在我的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>
Run Code Online (Sandbox Code Playgroud)

因此,对于特定用例,假设用户通过单击应用程序启动器内的图标从主屏幕启动应用程序.启动应用程序后,用户从主活动导航到活动A,然后最终导航到活动B.此时,用户决定检查他们的Facebook,所以他们点击主页按钮将我的应用程序放在后台,然后启动Facebook应用程序.

在检查他们的Facebook后,用户想要返回我的应用程序,所以他们按下主页键,然后从应用程序启动器启动应用程序(就像他们第一次启动时那样).

当用户返回我的应用程序时,我希望应用程序返回到应用程序放入后台时用户所处的最后一项活动,在本例中为活动B.在清单文件中,我设置了alwaysRetainTaskState = true确保操作系统不会破坏我的应用程序的活动.

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

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

Jam*_*mes 9

FYI singleTask不是你想要的,因为它开始了一项新任务:

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

你是如何推出活动B的?任何非标准的启动模式或Intent标志?

  • 是的我不知道为什么这么多SO回答这样的问题(app恢复等)建议使用singleTask - 它通常不是你想要的... (2认同)

Her*_*mps 7

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

假设我有一个带有活动的应用程序A - > B - > C等.如果我的应用程序从应用程序列表启动器启动,我的应用程序总是"恢复"到A.从"怨恨"屏幕(长期按下)恢复将表现出正确的恢复行为(按预期恢复到B或C).我的清单没什么特别的,我在我的root活动中设置了alwaysRetainTaskState ="true",而启动模式是默认的(标准).

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

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

  • 不.这里有一个关于它的错误(由其他人创建):https://code.google.com/p/android/issues/detail?id = 38194&q = app + resume + openn+done&cospecpec = ID + Type +状态+所有者+摘要+星星我发现很难理解这种行为是否会让更多人感到烦恼:/ (4认同)

Bos*_*one 3

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

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

这里要注意的是:我确实实现了这个模式并且它运行得相当好。然而,它似乎与历史不太相符,最后我放弃了并删除了这段代码。到目前为止还没有人抱怨过。