在Android中活动之间的对象共享

8

你好,我有一个关于在整个应用程序中传递对象的问题。

假设我想在整个应用程序中使用一个大的自定义对象。

这个对象将被多个活动和服务使用。

我最初所做的是:

首先,我创建了一个Application类并定义了一个单例对象。

public class FooApplication extends Application {
    public static SharedObj obj;
    ...
}

其次,在一个活动中,我设置了该对象的值。

public class FooActivity extends Activity {
    OnCreate() {
        FooApplication.obj = SharedObj.getInstance();
    }
}

第三步,我在另一个活动中访问此对象。

public class BarActivity extends Activity {
    OnCreate() {
        SharedObj useThis = FooApplication.obj;
    }
}

我的问题是,这个代码有什么问题吗? 它似乎工作得很好,但我发现有时这个单例对象的值会因某些原因被设置为null。 我之所以像这样共享对象而不是将其变成可包含对象,主要原因是这样做对我来说有点昂贵,而我所做的看起来更容易。有什么缺点吗?
经过一些研究,我发现还有另一种方法可以在整个应用程序中共享对象。
首先,在应用程序类中定义。
public class FooApplication extends Application {
    public SharedObj obj = new SharedObj();
    ...
}

其次,在活动中像这样进行初始化

public class FooActivity extends Activity {
    OnCreate() {
        FooApplication fooApp = (FooApplication)getApplicationContext();
        fooApp.obj = new SharedObj();
    }
}

第三步,在另一个活动中,我访问这个对象。
public class BarActivity extends Activity {
    OnCreate() {
        SharedObj useThis = ((FooApplication)getApplicationContext()).obj;
    }
}

使用getapplicationContext()方法与在第一部分中使用单例对象有何不同?这个方法更推荐使用吗?

提前感谢您的帮助!

1个回答

11
这种做法的主要缺点是Android系统在任何时候都可能杀死您的进程。通常情况下,这是在需要为其他用途(例如来电)释放内存时完成的。然后,Android将重新启动您的进程,并重新创建每个活动(当活动变为可见时)。这样做将调用每个活动的onCreate方法,向其传递该活动保存的打包数据的捆绑包。
应用程序类也将被重新创建。但是,您保存在其中的对象不会被重新创建。
因此,尽管有些痛苦,但打包确保您的对象可以恢复到活动(和进程)被杀死时的状态。
另一种方法是自己持久化对象。使用SharedPreferences是一种常见的方法。
总之,我建议通过Intent从一个活动传递对象到另一个活动。用于启动活动的意图始终在重新创建该活动时完全重建,即使在进程被杀死/重新启动的情况下也是如此。

谢谢您的回复。那么您的意思是,使用FooApplication.obj和((FooApplication)getApplicationContext()).obj这两种方法并没有任何区别吗? - user2062024
2
是的。您提出的两种方法都有相同的缺点。它们都依赖于应用程序对象中的数据。当进程重新创建时,这些数据将不会被重置。 - EJK
我明白了。那么,当进程重新启动时,单例对象也会出现相同的问题,对吗?如果是这样的话,也许我在Android中就不应该使用单例对象了,对吗? - user2062024
2
一般而言,在Android中应该避免使用单例模式。这并不意味着你不能通过谨慎编程使它们正常工作-例如,如果你确保了单例对象在应用程序关闭/重新启动时状态总是被正确设置,那么它可能会正常工作。但这很复杂,难以做到完全正确,因此通常不建议使用。 - EJK

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