Android Context对象是否可序列化?

时间:2012-10-29 04:40:38

标签: android static sharedpreferences android-context

我在SharedPreferences类中声明了一个名为PREFS的非最终静态Constants.java对象和其他常量:

public static SharedPreferences PREFS = null;

我这样做的原因是我的应用程序由大约6个不同的AsyncTasks组成,这些SharedPreferences继续访问相同的共享prefs文件,我不想得到Editor及其{{ 1}}每一次。在我的应用首次运行时,我会在getSharedPreferences()中拨打MainActivity并将其存储到PREFS,以便在AsyncTask被触发之前指向实例,因此避免使用NullPointerException

但是,无论如何,我始终从NullPointerException获得AsyncTask s。所有堆栈跟踪指向我调用Constants.PREFS以获取值的行。我的理论是,经过一段时间后,Android会终止我的应用程序流程,因此下次我AsyncTask的任何警报发出警报时,Constants.PREFS的值都会为null

我的问题是:我应该为Context创建一个静态变量吗?即使Android取消了我的流程,它的状态也会持续存在吗?当后者被实例化时,我总是将Context的引用传递给我的AsyncTask,以便他们可以调用getSystemService(),并且永远不会抛出NullPointerException。但是,我没有看到Context从Android文档扩展Serializable

1 个答案:

答案 0 :(得分:2)

使用Application类在整个应用程序中全局共享首选项。

public class MyApp extends Application {
    private static Context mAppContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mAppContext = getApplicationContext();
    }

    public static SharedPreferences getPreferences(){
        return mAppContext.getSharedPreferences("my_app_preferences",MODE_MULTI_PROCESS);
    }
}

告诉android你想要你的自定义Application类,在清单中提到它:

<application android:name=".MyApp" android:label="@string/app_name" android:icon="@drawable/ic_launcher">

现在从任何地方,只需致电

MyApp.getPreferences().edit().putBoolean("pref1",true). . . put more stuff . .commit()

MODE_MULTI_PROCESS确保所有AsyncTask线程都获得对同一SharedPreferences实例的同步访问。此外,commit()是原子的,并将持续更改磁盘。

上述模式对于从任何地方访问资源也很方便。

<强>更新

似乎对上下文的静态引用会导致新的Instant Run功能出现问题。

因此,可以要求上下文作为效用方法的参数:

public static SharedPreferences getPreferences(context){
    return context.getSharedPreferences("my_app_preferences",MODE_MULTI_PROCESS);
}