搞乱Android的共享偏好 - 使用哪个功能?

Hac*_*k06 4 android default sharedpreferences

这是一个标准任务:在应用程序的共享首选项中存储一些值,以便以后能够检索它.但是人们会发现有3个函数可以在那里存储一个值:

//1.
public static SharedPreferences PreferenceManager.getDefaultSharedPreferences(Context context) {}

//2.
public SharedPreferences Activity.getPreferences(int mode) {}

//3.
public SharedPreferences ContextWrapper.getSharedPreferences(String name, int mode) {}
Run Code Online (Sandbox Code Playgroud)

所以现在问题是:选择哪一个,哪一个更好,或者每个人的目的是什么?

Hac*_*k06 6

这是我自己的问题的答案:

首先,我们来看看这3个函数的实现.

//1.
public static SharedPreferences PreferenceManager.getDefaultSharedPreferences(Context context) {
    return context.getSharedPreferences(getDefaultSharedPreferencesName(context), getDefaultSharedPreferencesMode());
}

//2.
public SharedPreferences Activity.getPreferences(int mode) {
    return getSharedPreferences(getLocalClassName(), mode);
}

//3.
public SharedPreferences ContextWrapper.getSharedPreferences(String name, int mode) {
    return mBase.getSharedPreferences(name, mode);
}
Run Code Online (Sandbox Code Playgroud)

这里mBase是对Context类型对象的引用.

我们看到第二个函数调用第三个函数,所有这三个函数基本相同但参数不同.想想重载.

接下来,深入了解第一个函数的实现,我们可以简化其调用,如下所示:

//1.
public static SharedPreferences PreferenceManager.getDefaultSharedPreferences(Context context) {
    return context.getSharedPreferences(context.getPackageName() +
        "_preferences", Context.MODE_PRIVATE);
}
Run Code Online (Sandbox Code Playgroud)

同样,对于第二个功能:

//2.
public SharedPreferences Activity.getPreferences(int mode) {
    return mBase.getSharedPreferences(getLocalClassName(), mode);
}
Run Code Online (Sandbox Code Playgroud)

总而言之,第1个函数创建一个名称为的共享首选项文件<your_package_name>_preferences,第二个函数创建一个名称为的共享首选项文件<your_class_name>,最后,第三个函数允许您为共享首选项文件指定任意名称.

不用说,您需要为共享首选项文件指定正确的名称,以便返回保存的值.因此,您可以使用第3个函数自己指定名称,或者使用与之前保存方式相对应的第1个或第2个函数.

警告!确保传递Context类的正确实例.例如,一个混乱的场景看起来像这样:你从系统中运行的后台线程保存到共享首选项(例如,当使用android的开箱即用的SyncAdapter框架时)并尝试返回从UI线程中保存的值,您可能会得到默认/错误的值!

希望这对其他人有帮助......;)