我有一个以编程方式创建EditText视图的应用程序。我使用setId()为该视图分配一个ID
myEditText.setId(100);这样,Android会在暂停/停止应用程序时自动保存该对象的状态(正如我建议的那样,这里)。It 在以下情况下工作:
Bundle恢复活动)。对象状态也保持不变。但是,在这种情况下,它的不工作:
EditText对象是空的。对为什么会发生这种情况有何解释?Android真的区分了使用"Home“和"Back”的应用程序吗?根据文档,即使活动被销毁,也应该通过Bundle自动保存对象的状态。这显然发生在(2)的情况下。但在第三种情况下就不行了!
如果这是正常行为,当用户按“回”键时,我怎么能让应用程序的状态自动保存和恢复呢?我知道我可以用SharedPreferences来做这个,但我宁愿让机器人自动完成,就像在(1)和(2)情况下一样。
这种情况至少发生在Android4.0和4.2中(我还没有测试过其他人)。
发布于 2013-12-21 18:10:17
我想我找到了解释。我只需要更仔细地阅读文档(感谢@lentz获得其中一个链接);请参阅这里和这里
当您的活动因用户按回或活动完成而被破坏时,系统对该活动实例的概念将永远消失,因为该行为表明不再需要该活动。 如果用户按后退按钮,当前活动将从堆栈中弹出并销毁。堆栈中的前一个活动将继续进行。当活动被破坏时,系统不会保留该活动的状态。
以上解释了我问题中的行为(3)。
但是,如果系统由于系统约束(而不是正常的应用程序行为)而破坏活动,那么尽管实际的活动实例已经消失,但系统会记住它的存在,即如果用户导航回它,系统将使用一组保存的数据创建活动的新实例,该数据描述活动被销毁时的状态。系统用于恢复以前状态的保存数据称为“实例状态”,是存储在Bundle对象中的键值对的集合。
以上可能解释了行为(1)和(2)。
我不明白为什么应该将用户按回按解释为“不再需要活动”(“不需要保留其状态”)。但那是另一回事。
发布于 2013-12-21 16:32:59
你真的应该学习活动生命周期,因为有很多方法可以解决这个问题。由于您的活动通常是从堆栈中取出并在您向后导航时销毁的,所以最好的方法是确保您的活动在清单中标记为singleTop或singleInstance,这样它就不会从堆栈中取出,并在来回导航时重新创建。您还可以使用单例应用程序类。或者以平行线的形式来回传递文本。或者使用数据库。或者使用MVC或其他编程范例,允许您的视图被销毁并重新创建,同时填充它们的数据也会随之进行。很多“或”。研究活动生命周期,然后看看如何已经设置了应用程序体系结构,并选择最适合您的方法。
http://developer.android.com/training/basics/activity-lifecycle/index.html
http://developer.android.com/guide/components/tasks-and-back-stack.html
https://stackoverflow.com/questions/20720874
复制相似问题