当用户按下“后退”按钮时保持对象的状态

时间:2013-12-21 16:06:12

标签: android android-edittext restore

我有一个应用程序,我以编程方式创建EditText视图。我使用setId()

为该视图分配了ID
myEditText.setId(100);

以便Android在暂停/停止应用时自动保存该对象的状态(因为我被建议here)。在这些情况下有效

  • (1)当我使用“主页”按钮离开应用程序时:如果我然后返回应用程序,则会按预期恢复对象的状态(显示的文本)。
  • (2)在屏幕方向更改(涉及Android自动销毁活动并通过Bundle恢复)。对象状态也会保留。

但是,在这种情况下无效

  • (3)当我使用“后退”按钮离开应用程序时:如果我再回到应用程序,则EditText对象为空。

有关为何发生这种情况的任何解释? Android真正区分将应用程序与“Home”和“Back”分开吗?根据{{​​3}},即使活动被销毁,也应该通过Bundle自动保留对象的状态。情况(2)显然会发生这种情况。但不是在案例中(3)!

如果这是正常行为,当用户按下“返回”时,如何自动保存和恢复应用程序的状态?我知道我可以使用SharedPreferences,但我宁愿让Android自动执行,就像在情况(1)和(2)中一样。

这至少在Android 4.0和4.2中发生(我没有测试过其他人)。

2 个答案:

答案 0 :(得分:3)

你真的应该研究活动生命周期,因为有很多方法可以解决这个问题。由于您的活动通常从堆栈中拉出并在您快速导航时被破坏,但最好的方法是确保您的活动在清单中标记为singleTop或singleInstance,这样就不会从堆栈中删除并重新创建当你来回导航时。您还可以使用单例Application类。或者将文本来回传递为params。或者使用数据库。或者使用MVC或其他一些编程范例,这些范例将允许您的视图被破坏并重新创建,而不会使用填充它们的数据。很多“或者”。研究活动生命周期,然后查看您已经如何设置应用程序架构,并选择最适合您的方法。

http://developer.android.com/training/basics/activity-lifecycle/index.html

http://developer.android.com/guide/components/tasks-and-back-stack.html

答案 1 :(得分:1)

我想我找到了解释。我只需要更仔细地阅读文档(感谢@lentz的链接之一);见herehere

  

当您的活动因用户按下Back或活动自行完成而被销毁时,系统对该Activity实例的概念将永远消失,因为该行为表明不再需要该活动。

     

如果用户按下“返回”按钮,则会从堆栈中弹出当前活动并将其销毁。堆栈中的先前活动已恢复。当活动被销毁时,系统不会保留活动的状态。

以上解释了我的问题中的行为(3)。

  

但是,如果系统因系统限制而破坏活动(而不是正常的应用程序行为),那么虽然实际的Activity实例已经消失,但系统会记住它存在,如果用户导航回到它,系统使用一组保存的数据创建活动的新实例,这些数据描述了活动在销毁时的状态。系统用于恢复先前状态的已保存数据称为“实例状态”,是存储在Bundle对象中的键值对的集合。

以上可能解释了行为(1)和(2)。

我看不到为什么用户按下Back应该被解释为“不再需要活动”(“不需要保留其状态”)。但那是另一回事。