弄乱 android 的共享首选项 - 使用哪个函数?
Mess with the shared preferences of android - which function to use?
这是一个标准任务:在应用程序的共享首选项中存储一些值,以便以后能够检索它。
但是你会发现里面有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) {}
那么现在的问题是:选择哪一个,哪个更好,或者每个都有不同的目的?
这是我自己的问题的答案:
首先,让我们看一下这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);
}
这里的 mBase 是对 Context 类型对象的引用。
我们看到第二个函数调用了第三个函数,这三个函数基本上是等价的,只是参数不同。想想重载。
接下来,深入到第一个函数的实现,我们可以简化其调用如下:
//1.
public static SharedPreferences PreferenceManager.getDefaultSharedPreferences(Context context) {
return context.getSharedPreferences(context.getPackageName() +
"_preferences", Context.MODE_PRIVATE);
}
同样,对于第二个函数:
//2.
public SharedPreferences Activity.getPreferences(int mode) {
return mBase.getSharedPreferences(getLocalClassName(), mode);
}
总而言之,第一个函数创建了一个名为 <your_package_name>_preferences
的共享首选项文件,第二个函数创建了一个名为 <your_class_name>
的共享首选项文件,最后,第三个函数允许您为共享首选项文件指定任意名称。
不用说,您需要为共享首选项文件指定正确的名称才能检索保存的值。所以你可以使用第三个函数来自己指定名称,或者根据你之前的保存方式使用第一或第二个函数。
警告!确保您传递的是正确的上下文实例 class。
例如,一个混乱的场景看起来像这样:您正在从系统中 运行 的后台线程保存到共享首选项(例如,当使用 android 的 out-of-the -box SyncAdapter 框架)并尝试从您的 UI-thread 取回保存的值,您可能会得到 default/wrong 值!
希望这对其他人有所帮助...;)
它的唯一方法,只是不同的调用和可访问性
- "default" 表示您没有声明存储数据的 XML 文件的名称(这就是
SharedPreferences
的工作方式)并且每个 Activity
都可以使用它/Context
(比方说 "globally")——如果你想保留几个值,你可以使用这个
- 保持值仅可用于调用
Acivity
- "private" 用于存储 Activity
,但请注意 int mode
- 最后一个也像第一个一样工作 "globally",但在这里
您可以声明文件名并保留几个不同种类的文件
values - 专用于创建更复杂的存储值结构(一些包装器等)
视情况而定。 #1 将 return SharedPreferences 用于您传递的任何上下文。 #2 将 return 您所在的 Activity 上下文的 SharedPreferences。这可能与 #1 相同,也可能不同。 #3 会让您将 SharedPreferences 分成不同的组并命名。这可能是一个很好的分手方式,但我从来没有真正做过。
我正在分享我的,希望它能让生活变得轻松 -
public class SharedPreferenceStore {
public static void deleteValue(Context context, String key) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Editor editor = preferences.edit();
editor.remove(key).apply();
}
public static void storeValue(Context context, String key, String value) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Editor editor = preferences.edit();
editor.putString(key, value).apply();
}
public static void storeValue(Context context, String key, boolean value) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Editor editor = preferences.edit();
editor.putBoolean(key, value).apply();
}
public static void storeValue(Context context, String key, double value) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
String doubleVal = String.valueOf(value);
Editor editor = preferences.edit();
editor.putString(key, doubleVal).apply();
}
public static void storeValue(Context context, String key, float value) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Editor editor = preferences.edit();
editor.putFloat(key, value).apply();
}
public static void storeValue(Context context, String key, long value) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Editor editor = preferences.edit();
editor.putLong(key, value).apply();
}
public static void storeValue(Context context, String key, int value) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Editor editor = preferences.edit();
editor.putInt(key, value).apply();
}
/*************************
* GET Methods
***************************************/
public static String getValue(Context context, String key, String defValue) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
return preferences.getString(key, defValue);
}
public static boolean getValue(Context context, String key, boolean defValue) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
return preferences.getBoolean(key, defValue);
}
public static double getValue(Context context, String key, double defValue) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
String doubleVal = String.valueOf(defValue);
return Double.parseDouble(preferences.getString(key, doubleVal));
}
public static float getValue(Context context, String key, float defValue) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
return preferences.getFloat(key, defValue);
}
public static long getValue(Context context, String key, long defValue) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
return preferences.getLong(key, defValue);
}
public static int getValue(Context context, String key, int defValue) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
return preferences.getInt(key, defValue);
}
}
只需使用 class 并忘记 SharedPrefences 的所有并发症。希望对你有帮助:)
这是一个标准任务:在应用程序的共享首选项中存储一些值,以便以后能够检索它。 但是你会发现里面有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) {}
那么现在的问题是:选择哪一个,哪个更好,或者每个都有不同的目的?
这是我自己的问题的答案:
首先,让我们看一下这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);
}
这里的 mBase 是对 Context 类型对象的引用。
我们看到第二个函数调用了第三个函数,这三个函数基本上是等价的,只是参数不同。想想重载。
接下来,深入到第一个函数的实现,我们可以简化其调用如下:
//1.
public static SharedPreferences PreferenceManager.getDefaultSharedPreferences(Context context) {
return context.getSharedPreferences(context.getPackageName() +
"_preferences", Context.MODE_PRIVATE);
}
同样,对于第二个函数:
//2.
public SharedPreferences Activity.getPreferences(int mode) {
return mBase.getSharedPreferences(getLocalClassName(), mode);
}
总而言之,第一个函数创建了一个名为 <your_package_name>_preferences
的共享首选项文件,第二个函数创建了一个名为 <your_class_name>
的共享首选项文件,最后,第三个函数允许您为共享首选项文件指定任意名称。
不用说,您需要为共享首选项文件指定正确的名称才能检索保存的值。所以你可以使用第三个函数来自己指定名称,或者根据你之前的保存方式使用第一或第二个函数。
警告!确保您传递的是正确的上下文实例 class。 例如,一个混乱的场景看起来像这样:您正在从系统中 运行 的后台线程保存到共享首选项(例如,当使用 android 的 out-of-the -box SyncAdapter 框架)并尝试从您的 UI-thread 取回保存的值,您可能会得到 default/wrong 值!
希望这对其他人有所帮助...;)
它的唯一方法,只是不同的调用和可访问性
- "default" 表示您没有声明存储数据的 XML 文件的名称(这就是
SharedPreferences
的工作方式)并且每个Activity
都可以使用它/Context
(比方说 "globally")——如果你想保留几个值,你可以使用这个 - 保持值仅可用于调用
Acivity
- "private" 用于存储Activity
,但请注意int mode
- 最后一个也像第一个一样工作 "globally",但在这里 您可以声明文件名并保留几个不同种类的文件 values - 专用于创建更复杂的存储值结构(一些包装器等)
视情况而定。 #1 将 return SharedPreferences 用于您传递的任何上下文。 #2 将 return 您所在的 Activity 上下文的 SharedPreferences。这可能与 #1 相同,也可能不同。 #3 会让您将 SharedPreferences 分成不同的组并命名。这可能是一个很好的分手方式,但我从来没有真正做过。
我正在分享我的,希望它能让生活变得轻松 -
public class SharedPreferenceStore {
public static void deleteValue(Context context, String key) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Editor editor = preferences.edit();
editor.remove(key).apply();
}
public static void storeValue(Context context, String key, String value) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Editor editor = preferences.edit();
editor.putString(key, value).apply();
}
public static void storeValue(Context context, String key, boolean value) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Editor editor = preferences.edit();
editor.putBoolean(key, value).apply();
}
public static void storeValue(Context context, String key, double value) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
String doubleVal = String.valueOf(value);
Editor editor = preferences.edit();
editor.putString(key, doubleVal).apply();
}
public static void storeValue(Context context, String key, float value) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Editor editor = preferences.edit();
editor.putFloat(key, value).apply();
}
public static void storeValue(Context context, String key, long value) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Editor editor = preferences.edit();
editor.putLong(key, value).apply();
}
public static void storeValue(Context context, String key, int value) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Editor editor = preferences.edit();
editor.putInt(key, value).apply();
}
/*************************
* GET Methods
***************************************/
public static String getValue(Context context, String key, String defValue) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
return preferences.getString(key, defValue);
}
public static boolean getValue(Context context, String key, boolean defValue) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
return preferences.getBoolean(key, defValue);
}
public static double getValue(Context context, String key, double defValue) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
String doubleVal = String.valueOf(defValue);
return Double.parseDouble(preferences.getString(key, doubleVal));
}
public static float getValue(Context context, String key, float defValue) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
return preferences.getFloat(key, defValue);
}
public static long getValue(Context context, String key, long defValue) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
return preferences.getLong(key, defValue);
}
public static int getValue(Context context, String key, int defValue) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
return preferences.getInt(key, defValue);
}
}
只需使用 class 并忘记 SharedPrefences 的所有并发症。希望对你有帮助:)