Android应用和活动之间的静态存储

时间:2012-10-04 12:24:17

标签: android android-activity static singleton storage

我有一个Android应用程序,其中我使用一个类在活动之间存储静态数据,如:

class Global
{
      private static boolean mInitialized = false;
  private static String  mData        = null;

  public static void init()
  {
    mData        = "something";
    mInitialized = true;
  }

      public static boolean isInitialized()
      {
            return mInitialized;
      }

  public static String getData()
  {
    return mData;
  }
}

所以在onCreate的主要活动中我做了:

if( Global.isInitialized() == false )
    Global.init();

然后开始其他活动,行动流程为:

MainActivity - > ActionActivity - > PluginActivity

Main是我在哪里创建Global类,Action&插件是我使用该类的getData()方法的地方。

现在在某些情况下,我得到了非常奇怪的行为......如果PluginActivity(例如NullPointerException)中发生了一些不受欢迎的事情,则活动崩溃并且应用程序返回到启动它的ActionActivity,但是,此时, ActionActivity的onCreate(其中Global类应该被初始化)我得到一个异常,因为getData()返回null(并且isInitialized()为false),因为MainActivity从未初始化Global类。

那么,如果发生类似意外异常的事情,那么像我的Global类这样的静态成员的对象是否可以被释放/清除?

2 个答案:

答案 0 :(得分:4)

一般而言,活动应相互独立。你不应该依赖它们以任何特定的顺序发动,或者根本不是。

相反,如果您需要在活动之间共享全局状态数据,即不仅通过onActivityResult(),子类Application传递意图附加信息或结果,请将init代码放入其onCreate()中并使用getApplication()从活动中访问它。还记得在清单中声明应用程序类。当您的任何活动正在运行时,系统会注意应用程序对象。

答案 1 :(得分:0)

在Android中,每当应用程序崩溃时,静态变量都将被丢弃。这就是您获得NullPointerException的原因。而不是使对象静态创建ParcelableSerializable类并获取和设置字段,然后使用intent传递该对象。在另一项活动中,您可以获得ParcelableSerializable类,并且可以使用其属性。