getSharedPreferences()与getSharedPreferences()与getDefaultSharedPreferences()的区别
http://blog.csdn.net/ah200614435/article/details/7869681
一直迷惑于这三个方法的关系,最近忙完项目,好好的分析一下。
如果你熟悉Context那么你可能知道Context当中有这样一个方法:(关于Context的说明)
一、getSharedPreferences(String name, int mode)
abstract SharedPreferences getSharedPreferences(String name, int mode)
Retrieve and hold the contents of the preferences file 'name', returning a SharedPreferences through which you can retrieve and modify its values. Only one instance of the SharedPreferences object is returned to any callers for the same name, meaning they will see each other's edits as soon as they are made.
得到名为‘name’的偏好文件。同时你可以更改和返回他的值。任何调用者在调用同样名字的偏好文件时只有一个实例返回,这就意味着这些调用者都可以看到其他调用者做出的更改。
这个函数的参数如下:
Parameters
|
Desired preferences file. If a preferences file by this name does not exist, it will be created when you retrieve an editor (SharedPreferences.edit()) and then commit changes (Editor.commit()). mode: |
|
Operating mode. Use 0 or MODE_PRIVATE for the default operation, MODE_WORLD_READABLE andMODE_WORLD_WRITEABLE tocontrol permissions. The bit MODE_MULTI_PROCESS can also be used if multipleprocesses are mutating the same SharedPreferences file. MODE_MULTI_PROCESS isalways on in apps targetting Gingerbread (Android 2.3) and below, and off by default in later versions. |
name为本组件的配置文件名( 自己定义,也就是一个文件名),当这个文件不存在时,直接创建,如果已经存在,则直接使用,
mode为操作模式,默认的模式为0或MODE_PRIVATE,还可以使用MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE
mode指定为MODE_PRIVATE,则该配置文件只能被自己的应用程序访问。
mode指定为MODE_WORLD_READABLE,则该配置文件除了自己访问外还可以被其它应该程序读取。
mode指定为MODE_WORLD_WRITEABLE,则该配置文件除了自己访问外还可以被其它应该程序读取和写入
二、PreferenceManager的方法getSharedPreferences()
这个方法我们可以通过查看其源码:
- * Gets a SharedPreferences instance that preferences managed by this will
- * use.
- *
- * @return A SharedPreferences instance pointing to the file that contains
- * the values of preferences that are managed by this.
- */
- public SharedPreferences getSharedPreferences() {
- if (mSharedPreferences == null) {
- mSharedPreferences = mContext.getSharedPreferences(mSharedPreferencesName,
- mSharedPreferencesMode);
- }
- return mSharedPreferences;
- }
- /**
- * Gets a SharedPreferences instance that preferences managed by this will
- * use.
- *
- * @return A SharedPreferences instance pointing to the file that contains
- * the values of preferences that are managed by this.
- */
- public SharedPreferences getSharedPreferences() {
- if (mSharedPreferences == null) {
- mSharedPreferences = mContext.getSharedPreferences(mSharedPreferencesName,
- mSharedPreferencesMode);
- }
- return mSharedPreferences;
- }
这个方法是一个普通的方法,必须有PreferenceManager的实例调用才行,因此我们再按图索骥找找其构造方法。
- /**
- * This constructor should ONLY be used when getting default values from
- * an XML preference hierarchy.
- * <p>
- * The {@link PreferenceManager#PreferenceManager(Activity)}
- * should be used ANY time a preference will be displayed, since some preference
- * types need an Activity for managed queries.
- */
- private PreferenceManager(Context context) {
- init(context);
- }
- private void init(Context context) {
- mContext = context;
- setSharedPreferencesName(getDefaultSharedPreferencesName(context));
- }
- /**
- * This constructor should ONLY be used when getting default values from
- * an XML preference hierarchy.
- * <p>
- * The {@link PreferenceManager#PreferenceManager(Activity)}
- * should be used ANY time a preference will be displayed, since some preference
- * types need an Activity for managed queries.
- */
- private PreferenceManager(Context context) {
- init(context);
- }
- private void init(Context context) {
- mContext = context;
- setSharedPreferencesName(getDefaultSharedPreferencesName(context));
- }
- /**
- * Sets the name of the SharedPreferences file that preferences managed by this
- * will use.
- *
- * @param sharedPreferencesName The name of the SharedPreferences file.
- * @see Context#getSharedPreferences(String, int)
- */
- public void setSharedPreferencesName(String sharedPreferencesName) {
- mSharedPreferencesName = sharedPreferencesName;
- mSharedPreferences = null;
- }
- /**
- * Sets the name of the SharedPreferences file that preferences managed by this
- * will use.
- *
- * @param sharedPreferencesName The name of the SharedPreferences file.
- * @see Context#getSharedPreferences(String, int)
- */
- public void setSharedPreferencesName(String sharedPreferencesName) {
- mSharedPreferencesName = sharedPreferencesName;
- mSharedPreferences = null;
- }
- private static String getDefaultSharedPreferencesName(Context context) {
- return context.getPackageName() + "_preferences";
- }
- private static String getDefaultSharedPreferencesName(Context context) {
- return context.getPackageName() + "_preferences";
- }
由以上方法,我们可以知道,最终我们调用getSharedPreferences()方法得到的是一个名为”yourpackageName_preferences“的偏好。同时其mode为默认私有。
三、getDefaultSharedPreferences方法
- /**
- * Gets a SharedPreferences instance that points to the default file that is
- * used by the preference framework in the given context.
- *
- * @param context The context of the preferences whose values are wanted.
- * @return A SharedPreferences instance that can be used to retrieve and
- * listen to values of the preferences.
- */
- public static SharedPreferences getDefaultSharedPreferences(Context context) {
- return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
- getDefaultSharedPreferencesMode());
- }
- private static String getDefaultSharedPreferencesName(Context context) {
- return context.getPackageName() + "_preferences";
- }
- private static int getDefaultSharedPreferencesMode() {
- return Context.MODE_PRIVATE;
- }
- /**
- * Gets a SharedPreferences instance that points to the default file that is
- * used by the preference framework in the given context.
- *
- * @param context The context of the preferences whose values are wanted.
- * @return A SharedPreferences instance that can be used to retrieve and
- * listen to values of the preferences.
- */
- public static SharedPreferences getDefaultSharedPreferences(Context context) {
- return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
- getDefaultSharedPreferencesMode());
- }
- private static String getDefaultSharedPreferencesName(Context context) {
- return context.getPackageName() + "_preferences";
- }
- private static int getDefaultSharedPreferencesMode() {
- return Context.MODE_PRIVATE;
- }
这个方法是静态的,因此可以直接调用,同时它与我们调用getSharedPreferences()方法得到的返回值是一样的,只是调用的方式不同罢了。
四、SharedPreferences到底是什么
它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下:
- SharedPreferences sharedPreferences = getSharedPreferences("TEST", Context.MODE_PRIVATE);
- Editor editor = sharedPreferences.edit();//获取编辑器
- editor.putString("name", "Yang");
- editor.putInt("sex", "boy");
- editor.commit();//提交修改
- SharedPreferences sharedPreferences = getSharedPreferences("TEST", Context.MODE_PRIVATE);
- Editor editor = sharedPreferences.edit();//获取编辑器
- editor.putString("name", "Yang");
- editor.putInt("sex", "boy");
- editor.commit();//提交修改
生成的TEST.xml文件内容如下:
- <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
- <map>
- <string name="name">Yang</string>
- <int name="sex">boy</string>
- </map>
- <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
- <map>
- <string name="name">Yang</string>
- <int name="sex">boy</string>
- </map>
因为SharedPreferences背后是使用xml文件保存数据,getSharedPreferences(name,mode)方法的第一个参
数用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上。方法的第二个参数指定文件的操作模式,共有四种操作模式,这四种模式前面介绍
使用文件方式保存数据时已经讲解过。如果希望SharedPreferences背后使用的xml文件能被其他应用读和写,可以指定
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。
另外Activity还提供了另一个getPreferences(mode)方法操作SharedPreferences,这个方法默认使用当前类不带包名的类名作为文件的名称。
如果访问其他应用中的Preference,前提条件是:该preference创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。如:有个<package
name>为cn.yang.action的应用使用下面语句创建了preference。
getSharedPreferences("TEST", Context.MODE_WORLD_READABLE);
其他应用要访问上面应用的preference,首先需要创建上面应用的Context,然后通过Context 访问preference ,访问preference时会在应用所在包下的shared_prefs目录找到preference :
Context otherAppsContext = createPackageContext("cn.yang.action", Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("TEST", Context.MODE_WORLD_READABLE);
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("sex", "");
如果不通过创建Context访问其他应用的preference,也可以以读取xml文件方式直接访问其他应用preference对应的xml文件,如:
File xmlFile = new File(“/data/data/<package name>/shared_prefs/itcast.xml”);//<package name>应替换成应用的包名。
getSharedPreferences()与getSharedPreferences()与getDefaultSharedPreferences()的区别的更多相关文章
- Android数据持久化技术 — — —SharedPreferences
SharedPreferences是使用键值对的方式来存储数据. 要想使用SharedPreferences来存储数据,必须获取SharedPreferences对象,获取SharedPreferen ...
- Android Studio 学习(四) 数据库
文件存储 写数据 String data = "Data ti save"; FileOutputStream out =null; BufferedWriter writer = ...
- 支持不同Android设备,包括:不同尺寸屏幕、不同屏幕密度、不同系统设置
Some of the important variations that you should consider include different languages, screen sizes, ...
- Android四大组件全然解析(一)---Activity
本文參考\android\android\frameworks\base\core\java\android\app\Activity.java文件里的类凝视.以及android/frameworks ...
- 使用fragmenttabhost后,子fragment怎么获取ID?怎么用getSharedPreferences
使用fragmenttabhost后,子fragment怎么获取ID?怎么用getSharedPreferences public View onCreateView(LayoutInflater i ...
- android SharedPreferences apply和commit的区别
1.apply没有返回值而commit返回boolean表明修改是否提交成功2.apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘3.apply ...
- android 获取sharedpreference的三种方法的区别
1. public SharedPreferences getPreferences (int mode) 通过Activity对象获取,获取的是本Activity私有的Preference,保存在系 ...
- Android中@id与@+id区别
Android中的组件需要用一个int类型的值来表示,这个值也就是组件标签中的id属性值. id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等. 如果在@后 ...
- Android中@id与@+id区别和sharedUserId属性详解
Android中的组件需要用一个int类型的值来表示,这个值也就是组件标签中的id属性值. id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等. 如果在@后 ...
随机推荐
- 学以致用:让visualstudio爱上sublime
前言: 经常在vs中工作,但是一些编辑工作却非常喜欢sublime的方式,如果你也是,那我们来当媒婆吧,哈哈. 准备: Visualstudio一枚 Sublime一枚 ...
- JavaScript实现网页背景自动变色
JavaScript实现网页背景自动变色,自己变换颜色,设定时间和颜色值即可,在你设定的颜色值.一定时间内自动切换网页背景颜色. <!DOCTYPE HTML PUBLIC "-//W ...
- ffmpeg, libav学习记录
转载自:http://hi.baidu.com/y11022053/item/81f12035182257332e0f8196 一个偶然遇到了ffmpeg,看起来不多,而且通用性很强,算是一个扎实的技 ...
- 51单片机连接24C02-C语言测试代码
忙了一天多终于透彻了,自己写的不好使,用别人的逐步分析改成自己的,我写得非常简洁易懂. 我总结3点需要注意的地方 1.关闭非IIC通信器件,比如我的开发板SDA和SCL也连接了DS1302,造成干扰会 ...
- 采集爬虫中,解决网站限制IP的问题? - wendi_0506的专栏 - 博客频道 - CSDN.NET
采集爬虫中,解决网站限制IP的问题? - wendi_0506的专栏 - 博客频道 - CSDN.NET undefined
- Yii - 验证和授权(Authentication and Authorization)
1. 定义身份类 (Defining Identity Class) 为了验证一个用户,我们定义一个有验证逻辑的身份类.这个身份类实现[IUserIdentity] 接口.不同的类可能实现不同的验证 ...
- DirectShow Filter 开发典型例子分析 ——字幕叠加 (FilterTitleOverlay)1
本文分析一下<DirectShow开发指南>中的一个典型的Transform Filter的例子:字幕叠加(FilterTitleOverlay).通过分析该例子,我们可以学习到Direc ...
- Android——Cocosd2d-x手机游戏开发学习思路
手机APP应用如雨后春笋般冒了出来,而在众多的APP应用中,游戏占据了半壁江山.它丰富着人们的业余生活,增进了人们之间的沟通交流.也有许多开发的朋友对游戏开发情有独钟,他们不止是享受着有很多的人们去下 ...
- NIO组件Selector详解
Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 下面是 ...
- 修正android cocos2dx项目当点击属性时提示错误的问题
近期在用cocos2dx 3.x版本号做android版本号的时候,出现点击project-属性-C/C++ builder的时候会提示 The currently displayed paye co ...