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

use*_*024 6 singleton android sharing applicationcontext

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

首先,我创建了一个Application类并定义了一个singleton对象.

public class FooApplication extends Application {
    public static SharedObj obj;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

public class FooActivity extends Activity {
    OnCreate() {
        FooApplication.obj = SharedObj.getInstance();
    }
}
Run Code Online (Sandbox Code Playgroud)

第三,在另一个活动中,我访问了这个对象

public class BarActivity extends Activity {
    OnCreate() {
        SharedObj useThis = FooApplication.obj;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,这有什么问题?它似乎工作正常,但我发现有时这个单例对象的值由于某种原因被设置为null.我这样分享这个对象而不是让它变得可分的主要原因是这样做对我来说有点贵,我做的事情看起来很容易.有缺点吗?

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

首先,在app类中定义

public class FooApplication extends Application {
    public SharedObj obj = new SharedObj();
    ...
}
Run Code Online (Sandbox Code Playgroud)

其次,在这样的活动中初始化

public class FooActivity extends Activity {
    OnCreate() {
        FooApplication fooApp = (FooApplication)getApplicationContext();
        fooApp.obj = new SharedObj();
    }
}
Run Code Online (Sandbox Code Playgroud)

第三,在另一个活动中,我访问了这个对象

public class BarActivity extends Activity {
    OnCreate() {
        SharedObj useThis = ((FooApplication)getApplicationContext()).obj;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个方法(使用getapplicationContext())与使用单例对象有什么不同,就像我在第一部分中所做的那样?这是更推荐的吗?

提前致谢!

EJK*_*EJK 11

这种方法的主要缺点是Android系统可能会在任何时候终止您的进程.通常,当需要内存用于其他目的时(例如,来电话),这样做.然后,Android将重新启动您的流程,并重新创建每个活动(当活动变得可见时).在这样做时,它将调用每个活动的onCreate方法,向其传递活动已保存的一组包裹数据.

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

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

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

====

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

  • 是.你建议的两种方法都有相同的缺点.两者都依赖于应用程序对象中的数据.重新创建进程时,不会重置此数据. (2认同)
  • 一般来说,在Android中应避免使用单身人士.这并不意味着你不能通过谨慎编码来使它们工作 - 例如,如果你确保在应用程序终止/重新启动时总是正确地设置Singleton的状态,那么它可以工作.但这很复杂到足以使它变得正确,通常是气馁. (2认同)