Context.getSharedPreferences
getSharedPreferences 为 Context 的成员方法,需要参数 name 和 mode
先说 mode 参数,SharedPreferences 推荐仅在自己应用内使用,所以一般默认使用 Context.MODE_PRIVATE
再说 name 参数,系统会在 data/data/your.package.name/shared_prefs/ 路径下创建对应 ${name}.xml 文件作为 SharedPreferences 的存储
getSharedPreferences 具有缓存机制,相关部分源码如下
package android.app;
class ContextImpl extends Context {
// String key 为包名
// value 为该包名下,${name}.xml 文件与 SharedPreferencesImpl 实现实例的映射
private static ArrayMap<String, ArrayMap<File, SharedPreferencesImpl>> sSharedPrefsCache;
// String key 为 SharedPreferences 的 name 参数
// value 为对应 ${name}.xml 文件
private ArrayMap<String, File> mSharedPrefsPaths;
}
getSharedPreferences 的流程为:
-
在 mSharedPrefsPaths 中根据 name 获取 file 缓存,不存在则在 data/data/your.package.name/shared_prefs/ 路径下创建对应 ${name}.xml 文件并缓存
-
在 sSharedPrefsCache 中根据 file 获取 SharedPreferences 缓存,不存在则创建 new SharedPreferencesImpl(file, mode) 并缓存
Activity.getPreferences
getPreferences 为 Activity 的成员方法,为单参方法,需要 mode 参数,基于 getSharedPreferences 实现,name 参数为 Activity 类名(由 Activity.getLocalClassName() 给出)
使用情景
可以将 SharedPreferences 分为两种:单一 activity 使用和跨 activity 使用
单一 activity 使用的例子为:某 activity 的页面元素新功能提示红点,仅在当前 activity 使用,出于逻辑的最小可见性考虑和 SharedPreferences 懒加载缓存机制,推荐使用 Activity.getPreferences 存取
跨 activity 使用的例子为:登录页面存储登陆方式,个人信息页面读取显示登陆方式,推荐使用 Context.getSharedPreferences 存取,最好全应用统一使用工具方法 PreferenceManager.getDefaultSharedPreferences(context) 获取 SharedPreferences 并将 preference key 存放于获取并使用该配置的地方,如上例中的人信息页面
工具方法 PreferenceManager.getDefaultSharedPreferences(context) 基于 getSharedPreferences 实现, name 参数为 ${包名}_preferences (由 PreferenceManager.getDefaultSharedPreferencesName(Context context) 给出),mode 参数为 Context.MODE_PRIVATE
网友评论