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

时间:2015-01-29 16:32:24

标签: android singleton sharing applicationcontext

您好我有一个关于在整个应用程序中传递对象的问题。 假设我想在整个应用程序中拥有一个大的自定义对象。 多个活动和服务将使用此对象。 我最初做的是这个。

首先,我创建了一个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。 我这样分享这个对象而不是让它变得可分的主要原因是这样做对我来说有点贵,我做的事情看起来很容易。有缺点吗?

经过一些研究后,我发现还有另一种方法可以在整个应用程序中共享一个对象。

首先,在app class中定义

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 个答案:

答案 0 :(得分:10)

这种方法的主要缺点是Android系统may kill your process at any point in time。通常,当需要存储器用于其他目的时(例如,来电呼叫),这样做。然后,Android将重新启动您的流程,并重新创建每个活动(当活动变得可见时)。在这样做时,它将调用每个活动的onCreate方法,向其传递活动已保存的一组包裹数据。

也将重新创建应用程序类。但是,您在那里保存的对象将不会被重新创建。

因此,尽管很痛苦,但是parcelization确保您的对象可以被用于活动(和进程)被杀死时的状态。

另一种方法是自己坚持对象。使用SharedPreferences是一种常见的方法。

====

总而言之,我建议通过Intent将对象从activity传递给activity。当重新创建该活动时,用于启动活动的意图总是完全重新构建,即使在进程终止/重新启动的情况下也是如此。