在Android中保存同一个Activity的多个实例状态

时间:2013-02-08 14:42:24

标签: android android-activity

我正在开发一个Android应用程序,我希望避免重新加载类似的数据来自相同的Activity使用相同的额外。

具体来说,当我使用extra启动我的Activity'A'时,我会使用额外的来从服务器加载远程数据。 从这个活动中,我可以用不同的额外重新启动'A'等等。

示例:

A:id1 - >答:id2 - >答:ID3

但是,它也可以是我已加载的额外内容:

A:id1 - >答:id2 - >答:id3 - > 答ID1

在这种情况下,我不会再次请求服务器或丢失活动堆栈。

据我所知,“onSaveInstanceState”允许保存一个Activity的一个实例,但在我的情况下,它是同一个Activity的多个实例(带有不同的附加内容)。

那么,它是否为同一个Activity管理已保存实例状态(包)列表的解决方案?或其他什么?

提前致谢

2 个答案:

答案 0 :(得分:3)

onSaveInstanceState方法未按您描述的方式使用。 Check this out,它是活动类的文档,特别是活动生命周期部分。 onSaveInstanceState是一种在操作系统因某种原因必须杀死一个Activity时被调用的方法。它允许您填充Bundle,这将有助于重新创建用户离开的Activity的特定实例。通常发生这种情况是因为用户切换到另一个应用程序并且操作系统正在杀死活动以回收内存,但也会在屏幕旋转时发生,因此平台的细微差别对于至少要注意是很重要的。

至于你的问题,我要做的是使用数据库来存储从服务器检索的信息。启动“活动”时,可以先检查数据库中是否存在需要填充该“活动”的数据。如果是,请从那里加载并显示它,否则进行服务器调用。

这很好,因为数据将在App的多次使用中持久存在。更进一步,如果来自服务器的数据有可能过时,您可以轻松扩展它以最初显示数据库中的数据,并触发对数据的异步请求,该数据将在UI和数据库返回时更新。您的用户几乎永远不会处于等待加载的状态,这总是一件好事!

Here's a good tutorial on the basics of implementing an sqlite database.这也将为您提供额外的好处,即将数据保存在应用程序的单独运行中。

作为替代方案,如果您确实不需要数据库的持久性或其他功能,并且不认为开销是值得的,那么您可以创建一个Singleton类来跟踪返回的数据,也许使用Application class来实现它。重要的是要注意(并给我们带来完整的循环),任何内存中存储此数据的方法都应该使用onSaveInstanceState进行管理,以确保在活动在意外时间被杀死时不会丢失任何数据。 / p>

答案 1 :(得分:0)

对于MattDavis的答案,

+1,但我也建议您使用所谓的“单身模式”。

基本上,这是一种在内存中缓存内容的方法。您创建一个类,其目的是保存您不想继续重新加载的所有数据库数据。这个对象有一个全局实例,最初为null。您调用一个返回该实例的静态方法。如果静态方法发现实例为null,则会创建实例,从数据库中填充实例,对其进行缓存,然后将其返回给调用者。从那时起,对实例的所有请求都只返回缓存副本。如果您的应用因系统缺乏资源而被系统杀死,并在以后再次启动,则会根据需要透明地重新创建实例。

这是一种非常常见的实现,适用于多线程环境:

public class Singleton {
    private static volatile Singleton instance = null;
    private Singleton() {
        // This is the place where you initialize the instance
        // from the database.
    }
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

我在很多地方使用这种模式;它非常方便。

要真正做到这一点,您还应该在活动中实现onLowMemory()或onTrimMemory(),以便在资源紧张时释放单例实例。