【问题标题】:When to use saveInstanceState() method?何时使用 saveInstanceState() 方法?
【发布时间】:2013-08-13 12:02:55
【问题描述】:

我知道saveInstanceState()是用来存储activity变量、EditText中的文本等

但我有疑问是否应该保存视图状态?

让我给你一个场景。我的视图有 3 个按钮。单击其中一个时,会向用户显示一个 WebView(在同一活动中)。现在,如果应用程序被杀死,我是否应该保存当应用程序被杀死时用户显示 WebView 以及重新创建活动时显示 WebView 而不是按钮的状态?

其他情况是,我有 3 个选项卡在视图中。选择每个选项卡会显示不同的视图。如上例所述,我是否应该保存该用户上次选择此选项卡?

如果你能解释我应该和不应该保存活动状态的情况,那将是最好的。

【问题讨论】:

    标签: android android-activity activity-state


    【解决方案1】:

    操作系统知道何时应该重新创建应用程序的先前状态(屏幕方向已更改或应用程序在后台被操作系统杀死)以及何时创建新实例(用户将应用程序留在后面按钮)。 onRestoreInstanceState() 方法仅在有要恢复的状态时调用(当系统正在恢复以前的状态,而不是创建活动的新实例时)。

    那么,简短的回答是,如果您覆盖 onSaveInstanceState()onRestoreInstanceState(),系统将在适当时调用它们,并且 您不必担心决定何时“应该”保存状态

    当覆盖onSaveInstanceState() 时,是的,您应该保存有关活动状态的所有信息。这是屏幕方向更改期间使用的方法。想一想 - 如果您旋转手机,您是否希望当前应用更改选项卡,或者刚刚打开的屏幕消失?

    有关详细信息,请参阅the Android documentation on recreating an activity

    【讨论】:

    • 我的应用不需要支持方向改变。它仅支持纵向。
    • 我不清楚是否应该使用这些方法。因为如果通过单击主页按钮将应用程序置于后台并再次打开应用程序,它会显示我最后的状态。那为什么我需要手动保存和恢复呢?
    • 如果您通过单击主页按钮将应用程序置于后台,它不一定会被完全杀死(只是暂停)。如果您将您的应用程序置于后台,然后打开足够多的其他应用程序,您的手机需要杀死您的应用程序以重新获得内存并然后重新打开您的应用程序,您将失去您的状态。作为用户,您在这两种情况下并没有真正做任何不同的事情,但是幕后发生的事情不同,您的应用应该同时支持这两种情况。
    • 我在一个活动中实现了这些方法,只是保存了 EditText 的文本。我按下主页按钮。应用程序在后台。一直按主页以查看后台应用程序列表。杀死了我的应用程序。又打开了。在将应用程序置于后台之前,以编程方式打开了我所在的活动(使用 Intent)。按照你说的,它应该已经保存了 bundle 并调用了 onRestoreInstanceState()。但它没有。
    • 我从模拟器 DDMS 的角度杀死了我的应用程序。然后再次打开它调用 onRestoreInstanceState。现在,我很满意。
    【解决方案2】:

    我还没有对 app gets killed 上的 savedIntanceState 做太多研究。但是是的,您可能会在状态中保存一个整数变量(指单击哪个按钮),以便在重新创建活动时,您知道曾经显示的 webview(或不显示)。你的第二种情况也是如此。

    保存实例状态的一些额外用例:

    最常用的场景之一是在用户切换方向期间,假设您在屏幕上有几个编辑文本,如果用户改变他的设备方向,它们的持有文本将会消失。保存的实例状态可帮助您恢复输入的文本。

    另一种情况是您的活动中很可能有一些类变量,可能用于保存用户所做的事情,或者列表活动中的一些临时列表对象。保存这些变量还可以防止您需要恢复方向变化的数据。

    【讨论】:

    • 我不确定是否应该使用这些方法来保存和恢复状态。一个原因是我的应用程序不支持纵向以外的方向。第二个原因是当我将应用程序置于后台并再次打开时,它会显示我将其置于后台的最后状态。例如,我在将应用程序置于后台之前选择了一个特定的选项卡,在打开应用程序后它向我显示该选项卡已被选中,这不是默认选择。让我们谈谈第三个应用程序被操作系统杀死的案例。如果应用程序被操作系统杀死,然后用户再次打开应用程序,我相信用户应该被引导到主屏幕。
    • 因为应用程序不在后台,所以它被关闭了。打开已关闭的应用程序应仅显示主屏幕。我在这第三种情况下是对的吗?
    • 就我个人而言,我会尽我所能将用户保持在他上次访问的位置(通过使用 db 或 sharedpref)。当用户按下 home 键时,他们中的大多数人更愿意在回来时拥有相同的屏幕。操作系统会杀死您的应用程序,因为内存不足,这不是用户会意识到的,他们希望看到使用主页按钮离开时显示的内容。在操作系统杀死您的应用程序后,我不太确定恢复 savedInstanceState 的可能性。
    • 但是当我按下主页并打开应用程序时,我只看到最后一个状态,这是最终目标。操作系统处理它。那我为什么要手动做呢?
    • 他们保留它,当您的应用程序仍在内存中时,您永远不知道操作系统何时会杀死它。当然,在被杀后恢复保存状态可能不起作用,我不确定,因此我建议 SharedPref 或 Db over savedInstanceState。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多