【问题标题】:Robust+easy way to save/restore Android app instance state [closed]保存/恢复Android应用程序实例状态的强大+简单方法[关闭]
【发布时间】:2010-02-19 19:11:08
【问题描述】:

在 Android 中,您需要实现以下 Activity 方法,以便在操作系统决定销毁然后重新创建您的 Activity 时将您的应用程序恢复到之前的状态:

public void onSaveInstanceState(Bundle savedInstanceState)
public void onRestoreInstanceState(Bundle savedInstanceState)

我见过的实现这些方法的示例是在 Bundle 对象(即仅原始对象)上使用 put/getBoolean、put/getInt 等来保存应用程序状态。这似乎是一种非常容易出错的方法来保存您的状态以备不时之需,我无法看到它如何扩展到存储复杂对象而不编写大量代码。

我有哪些选项可以以可靠且易于实施的方式存储/恢复状态?

如果这很重要,我的应用程序(一个游戏)需要存储大约 50 个对象,每个对象可能存储 5 个浮点变量和一些存储对其他对象的引用。我不想为我使用的每个类和子类(可能大约 15 个)编写保存/恢复方法。如果我可以将所有与状态相关的对象粘贴在一个名为“状态”的对象中,然后在“状态”上调用保存/加载来处理所有事情,那将是理想的。

是否可以选择使用 Java 序列化?我听说它很慢,但这是保存/恢复的问题吗?我可以将数据写入 SD 卡吗?到数据库?

【问题讨论】:

    标签: java android serialization


    【解决方案1】:

    看看Bundle类,它支持存储ParcelableSerializable。因此,如果您为您的状态对象实现这些接口之一,您应该已经准备就绪。

    【讨论】:

    • Doh,谢谢:Bundle 有一个“putSerializable”方法。不过,是否有一种普遍认可的最佳方式来存储对象呢?例如,我见过人们将他们的对象转换为 JSON 字符串,然后将该字符串作为包存储/加载。连载真的像人们想象的那么糟糕吗?是什么让它比正常慢得多(如果这是真的的话)?
    • 我认为转换为 JSON 只会浪费计算周期。
    【解决方案2】:

    还可以查看onRetainNonConfigurationInstancegetLastNonConfigurationInstance。它们允许您让您的对象被操作系统引用。当您的活动未运行时,并在重新创建活动时将其取回。这两个方法中的第一个是覆盖,第二个方法应在 onCreate 中调用。请注意,它们已被弃用,但在新的 android 版本中还有其他等效方法可用。 还要注意文档说

    只能用作优化

    ,并且您必须准备好恢复您的状态,否则。

    在内存中保留对象的另一种方法是继承 Application 类,如 this article 中所述。

    【讨论】:

    • onRetainNonConfigurationInstance 已弃用
    猜你喜欢
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多