我有一个应用程序,我以编程方式创建EditText
视图。我使用setId()
myEditText.setId(100);
以便Android在暂停/停止应用时自动保存该对象的状态(因为我被建议here)。在这些情况下有效:
Bundle
恢复)。对象状态也会保留。但是,在这种情况下无效:
EditText
对象为空。有关为何发生这种情况的任何解释? Android真正区分将应用程序与“Home”和“Back”分开吗?根据{{3}},即使活动被销毁,也应该通过Bundle
,自动保留对象的状态。情况(2)显然会发生这种情况。但不是在案例中(3)!
如果这是正常行为,当用户按下“返回”时,如何自动保存和恢复应用程序的状态?我知道我可以使用SharedPreferences,但我宁愿让Android自动执行,就像在情况(1)和(2)中一样。
这至少在Android 4.0和4.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的链接之一);见here和here:
当您的活动因用户按下Back或活动自行完成而被销毁时,系统对该Activity实例的概念将永远消失,因为该行为表明不再需要该活动。
如果用户按下“返回”按钮,则会从堆栈中弹出当前活动并将其销毁。堆栈中的先前活动已恢复。当活动被销毁时,系统不会保留活动的状态。
以上解释了我的问题中的行为(3)。
但是,如果系统因系统限制而破坏活动(而不是正常的应用程序行为),那么虽然实际的Activity实例已经消失,但系统会记住它存在,如果用户导航回到它,系统使用一组保存的数据创建活动的新实例,这些数据描述了活动在销毁时的状态。系统用于恢复先前状态的已保存数据称为“实例状态”,是存储在Bundle对象中的键值对的集合。
以上可能解释了行为(1)和(2)。
我看不到为什么用户按下Back应该被解释为“不再需要活动”(“不需要保留其状态”)。但那是另一回事。