Java 当应用程序返回内存时,单例不可用

Java 当应用程序返回内存时,单例不可用,java,android,singleton,Java,Android,Singleton,我面临的问题如下:当我启动我的应用程序时,所有的单例都在主活动中初始化,一切都按预期进行。然后,如果我按下home(主页)按钮并快速返回应用程序,一切都正常,我认为这是因为所有内容都在内存中,但如果我去chrome观看几段视频或开始一场游戏并尝试返回应用程序,我会遇到一个例外。我不理解应用程序的这种状态,因为它没有被杀死,但它不在内存中,它试图返回到它在按下home按钮之前的活动,onCreate方法被调用,我收到了在第一个位置调用活动的意图,但单例未初始化,异常发生在这里: Tracker

我面临的问题如下:当我启动我的应用程序时,所有的单例都在主活动中初始化,一切都按预期进行。然后,如果我按下home(主页)按钮并快速返回应用程序,一切都正常,我认为这是因为所有内容都在内存中,但如果我去chrome观看几段视频或开始一场游戏并尝试返回应用程序,我会遇到一个例外。我不理解应用程序的这种状态,因为它没有被杀死,但它不在内存中,它试图返回到它在按下home按钮之前的活动,onCreate方法被调用,我收到了在第一个位置调用活动的意图,但单例未初始化,异常发生在这里:

 Tracker tracker = GoogleAnalytics.getInstance(this).getDefaultTracker();
 tracker.set(Fields.SCREEN_NAME, "My View");
 tracker.send(MapBuilder
                    .createAppView()
                    .build()
    );
我尝试过的一个可能的解决方案就是检查跟踪器,如果它为空,则创建一个新跟踪器并进行设置:

if(tracker == null){
        tracker = GoogleAnalytics.getInstance(this).getTracker(trackerId);
        GoogleAnalytics.getInstance(this).setDefaultTracker(tracker);
}

但我在另一个单身汉身上得到了另一个例外。我的问题是:当应用程序处于这种状态时,内存中会保留哪些变量?我应该怎么做,当追踪器为空时调用finish?或者尝试主要活动?

尝试使用finish()并在If条件下添加Try-catch方法

简单地说,Android系统不会确保任何东西永远留在内存中,只要系统需要内存,它就会开始根据优先级清除后台应用程序和服务

  • 一种方法是,您可以让单例的getter处理,如果单例中的
    实例
    变量为null或未初始化,那么您应该初始化它,这可以解决您的问题,并且它将为您的方法添加延迟初始化风格

  • 另一种方法是,您可以在
    onSaveInstance()
    中添加一个标志,并在
    onCreate()
    中检查它,然后您就知道这是您的活动第一次启动,还是已从内存中清除并正在重新初始化


我也有同样的问题,如果内存不足,并且所有静态数据都消失了,应用程序似乎会被杀死。如果活动所需的静态实例不存在,我就完成活动。我想我也需要一个更好的解决方案。如果内存不足,单例将从内存中清除,为其他应用程序的数据腾出空间。尝试使用SQLite的共享首选项进行管理。我已经尝试过了,但它对用户不友好,因为您可以看到堆栈中的每个活动在到达主活动之前是如何被终止的,我想知道是否有办法将变量保留在内存中,或者只是启动主活动初始化变量null