【问题标题】:Keeping object's state when user presses "Back" button当用户按下“返回”按钮时保持对象的状态
【发布时间】:2013-12-21 16:06:11
【问题描述】:

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

myEditText.setId(100);

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

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

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

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

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

如果这是正常行为,当用户按下“返回”时,如何自动保存和恢复应用的状态?我知道我可以为此使用 SharedPreferences,但我宁愿让 Android 自动执行此操作,就像它在案例 (1) 和 (2) 中所做的那样。

至少在 Android 4.0 和 4.2 中会发生这种情况(我没有测试过其他版本)。

【问题讨论】:

  • 使用共享首选项来存储值并恢复它。单击后退按钮后,当前活动将从后堆栈弹出并被销毁。堆栈中的前一个活动获得焦点
  • @Raghunandan 谢谢,但正如我在问题中所说,我想在没有 SharedPreferences 的情况下这样做。理想情况下,我想要与 Home 按钮相同的行为:Android 自动保存和恢复
  • 当您使用返回按钮离开应用程序时,onDestroy() 方法也会在 onPause() 和 onStop() 方法之后调用。有关详细信息,请参阅活动生命周期。
  • @LuisMendo 使用 onSaveInstanceState 和 onRestoreInstanceState 您无法获取数据,因为当方向更改时,操作系统本身销毁的 Activity 和 Android 将保存您的数据,并且相同的数据将传递给下一个重新创建的 Activity..所以在这里您正在通过按主页按钮销毁 Activity,因此您需要保存数据并将其设置为新创建的活动。当主页按钮按下时,Activity 对象不会销毁..仅更改了活动状态。
  • 注意:onDestroy() 不保证会被调用。如果系统因缺乏资源而终止您的应用程序,则只能保证调用 onPause()(3.0 之前)或 onPause()onStop()(3.0及以上)。

标签: android android-edittext restore


【解决方案1】:

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

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

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

【讨论】:

  • +1 谢谢。但是,我的问题要窄得多:为什么视图状态自动保留在 Home press 而不是 Back press。更仔细地阅读文档,它确切地说: Home 和 Back 的处理方式确实不同。所以这是“正常”的行为,如果“正常”我们理解“由文档指定”
【解决方案2】:

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

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

如果用户按下后退按钮,当前活动将从堆栈中弹出并销毁。堆栈中的先前活动被恢复。当一个活动被销毁时,系统不会保留活动的状态。

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

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

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

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

【讨论】:

  • 这就是我要找的。我有同样的问题。现在我明白了,但我仍然不知道如何解决这个问题。你也没有提到。 @LuisMendo 有什么想法吗?
  • @Sudhanshu 好吧,正如我现在所看到的,没有什么可以修复。当用户按下 Back 时,Android 会忘记活动状态,但当他们按下 Home 时不会。这似乎就是 Android 的工作方式:Home 和 Back 的工作方式不同。如果你想保留 Back press 的状态,你应该使用 SharedPreferences 手动完成,如上面的 cmets 中所述
  • 感谢您的回复!我想我别无选择:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多