Android应用程序生命周期和singelton

Android应用程序生命周期和singelton,android,singleton,static-members,application-lifecycle,Android,Singleton,Static Members,Application Lifecycle,我们大多数人都熟悉这种模式: public class MySingeltone { public String mSomeReferenceTypeData; public int mSomeValueTypeData; private static MySingeltone mInstance; private MySingeltone() { } public static MySingeltone getInstance()

我们大多数人都熟悉这种模式:

   public class MySingeltone {

    public String mSomeReferenceTypeData;
    public int mSomeValueTypeData;

    private static MySingeltone mInstance;

    private MySingeltone() {

    }

    public static MySingeltone getInstance() {
        if (mInstance == null) {
            mInstance = new MySingeltone();
        }

        return mInstance;
    }
 }
我的问题是,我最近发现,在使用他的活动被销毁后,或者当整个应用程序假设为子句时,minInstance不等于null,例如:

public class SomeActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        MySingeltone mySingeltone = MySingeltone.getInstance();
        mySingeltone.mSomeReferenceTypeData = "some value";
    }
}
下次在关闭运行活动的整个应用程序后启动“SomeActivity”(例如,在..之后10秒)时,MinInstance仍保留相同的引用,其字段上的值相同

为什么会这样

我错过了什么


android垃圾收集静态成员何时属于应用程序

您无法控制Java对象何时被垃圾回收。当对象不再有(非循环)引用时,该对象就有资格进行垃圾收集。 此外,对于Android,您无法控制何时从内存中删除活动。

因为“minInstance”是一个静态变量,所以在关闭应用程序时它不会为null。关闭应用程序并不意味着您的应用程序已被销毁

此外,还没有关闭Android应用程序的概念。如果你退出你的应用程序,它不会同时被销毁。当应用程序不再使用时,Android操作系统在内部处理何时关闭应用程序。如果android决定销毁应用程序时内存不足,那么这个静态变量也将变为null

为什么会这样

我错过了什么

android垃圾收集静态成员何时属于应用程序

好的,首先,正如其他人所说,Android上没有紧密的应用程序概念,因为Android操作系统自己管理应用程序进程的生命周期

其次,你做了一个错误的测试——如果你没有关闭所有的应用程序,相反的做法是——通过启动越来越多的应用程序来填充内存,那么最终你的应用程序的内存将被清理出来供其他应用程序使用,这包括所有静态meber以及实例成员!然后,您将看到静态变量将如您所期望的那样为NULL

他们只是“懒洋洋地”清理内存,若有足够的内存,那个么您的应用程序可能永远不会被清理


事实上,没有办法解决这个问题,据我所知,没有办法确定一个对象在任何时候都不会从设备内存中被清除。在某些情况下,它会导致不良行为。例如,如果单例在创建时进行了大量处理,那么调用getInstance可能会使您的UI卡住,甚至会使您的应用程序因不负责任而崩溃

你在哪里检查singleton是否是同一个实例?@Jazzy Josh:你可以通过在设置新实例之前获取值来查看它。在我的示例中,它位于getInstance方法和下一行之间。只需要检查它是否不等于null,因为第一次启动时该值仍然为null。我特别指的是应用程序中的何处。如果您的活动从未被终止,那么您将从onStop转到onRestart和onStart,而不是通过onDestroy并被终止,您的单例将仍然活着。@Jazzy Josh:我肯定会通过onDestroy()。然后我要重新打开应用程序,这就是应该的。所以它是静态单态的。但我遇到了相反的情况:当引用保持活动被破坏时,单身汉也不见了!为什么?那么这是否意味着,如果我希望我的Singleton类在某些活动创建时为null,我需要在onDestroy()方法或类似的方法中将其设置为null?@Tan Kanel Yes。但奇怪的是,你想摧毁一个单体,因为单体被认为代表着某种永远存在的东西。也许你的singleton中有一些open()/close()/isOpened()方法,或者它应该是一个服务。是的,你说得对,这就是我正在做的,但我问它更多的是原理。这个答案是错误的,如果内存已满,android操作系统决定清空其应用程序,那么在下次尝试使用该变量时,该变量也将为null。