当用户按下“返回”按钮时保持对象状态

5

我有一个应用程序,在其中以编程方式创建一个EditText视图。我使用setId()为该视图分配一个ID。

myEditText.setId(100);

为了使Android在暂停/停止应用程序时自动保存对象的状态(就像我在这里被建议的那样),您需要在代码中执行以下操作。在以下情况下,它工作

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

但是,在以下情况下,它不起作用

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

为什么会发生这种情况? Android确实区分使用“主页”和使用“返回”离开应用程序吗?根据文档,即使活动被销毁,对象的状态也应该通过 Bundle 自动保存。这显然在(2)中发生了。但不是在(3)中!

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

这个问题至少发生在Android 4.0和4.2中(我没有测试其他版本)。


@Raghunandan 谢谢,但正如我在问题中所说的那样,我想不使用SharedPreferences来实现。理想情况下,我希望与Home按钮的行为相同:Android自动保存和恢复。 - Luis Mendo
@LuisMendo 这里是其他存储选项。http://developer.android.com/guide/topics/data/data-storage.html。如果你正在寻找解决方法,我不知道任何。 - Raghunandan
1
使用onSaveInstanceState和onRestoreInstanceState无法获取数据,因为当方向改变时,Activity会被操作系统销毁,并且Android将保存您的数据,并将其传递给下一个重新创建的Activity。所以在这里,您通过按Home按钮来销毁Activity,因此您需要保存数据并将其设置为新创建的Activity。当按下Home按钮时,Activity对象不会被销毁,只有Activity状态发生了改变。 - kalyan pvs
@kalyanpvs 但是当方向改变时,Android会自动为我的应用程序恢复文本。那么为什么按返回键时不行呢? - Luis Mendo
1
注意:onDestroy() 方法不能保证一定会被调用。如果系统因为资源不足而杀死您的应用程序,则只保证调用 **onPause()**(3.0 之前)或 onPause() 和 **onStop()**(3.0 及以上)。 - Edward Falk
显示剩余10条评论
2个回答

3
你应该学习活动生命周期,因为有很多种方法可以解决这个问题。由于当你返回时,你的活动通常会从栈中移除并销毁,一个快速但不一定是最好的方法是确保你在清单文件中将活动标记为singleTop或者singleInstance,这样它就不会从栈中移除并在前后导航时重新创建。你也可以使用单例应用程序类,或者将文本作为参数来回传递,或者使用数据库,或者使用MVC或其他编程范式,允许视图在数据不被清空的情况下被销毁和重建。有很多选择。学习活动生命周期,然后查看你已经设置好的应用程序架构,并选择最适合你的方法。

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

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


1
+1 谢谢。然而,我的问题更加具体:为什么视图状态在按下Home键时会自动保留,但在按下Back键时不会自动保留。仔细阅读文档后,它确切地说明了这一点:Home和Back实际上是被不同对待的。因此,如果我们理解“正常”行为是指“由文档指定”,那么这是“正常”的行为。 - Luis Mendo

1
我想我找到了解释。 我只需要仔细阅读文档(感谢@lentz提供的其中一个链接);请参见herehere
当用户按下Back键或活动自己完成时,系统对该Activity实例的概念将永远消失,因为该行为表明不再需要该Activity。
如果用户按下Back按钮,则当前Activity将从堆栈中弹出并被销毁。 堆栈中的前一个Activity将恢复。 当Activity被销毁时,系统不会保留Activity的状态。
以上解释了我的问题中的行为(3)。
然而,如果系统由于系统限制(而不是正常应用程序行为)销毁活动,则尽管实际的Activity实例已经消失,但系统仍会记住它的存在,以便如果用户返回到该活动,则系统将使用一组保存的数据创建一个新的活动实例,描述了当它被销毁时活动的状态。系统用于恢复先前状态的保存数据称为“实例状态”,是存储在Bundle对象中的键值对集合。
上面的内容可能解释了行为(1)和(2)。
我看不出来的是为什么用户按返回键应该被解释为“不再需要该活动”(“其状态不需要被保留”)。但这是另外一回事。

这正是我一直在寻找的。我也遇到了完全相同的问题。现在我明白了,但我仍然不知道如何解决它。你也没有提到如何解决。@LuisMendo 有什么想法吗? - Sudhanshu
@Sudhanshu 嗯,就我现在看来,没有什么需要“修复”的。当用户按下“返回”时,Android会忘记活动状态,但不会在按下“主页”时。这似乎是Android的工作方式:主页和返回的工作方式不同。如果您想在按下“返回”时保留状态,则应根据上面的评论手动使用SharedPreferences进行操作。 - Luis Mendo
谢谢回复!我猜我没有选择 :( - Sudhanshu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接