关闭

getSharedPreferences()与getSharedPreferences()与getDefaultSharedPreferences()的区别

标签: android开发
176人阅读 评论(0) 收藏 举报
分类:

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
   name:
  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 to control permissions. The bit MODE_MULTI_PROCESS can also be used if multiple processes are mutating the same SharedPreferences file. MODE_MULTI_PROCESS is always 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()

这个方法我们可以通过查看其源码:

  1. /** 
  2.     * Gets a SharedPreferences instance that preferences managed by this will 
  3.     * use. 
  4.     *  
  5.     * @return A SharedPreferences instance pointing to the file that contains 
  6.     *         the values of preferences that are managed by this. 
  7.     */  
  8.    public SharedPreferences getSharedPreferences() {  
  9.        if (mSharedPreferences == null) {  
  10.            mSharedPreferences = mContext.getSharedPreferences(mSharedPreferencesName,  
  11.                    mSharedPreferencesMode);  
  12.        }  
  13.          
  14.        return mSharedPreferences;  
  15.    }  

这个方法是一个普通的方法,必须有PreferenceManager的实例调用才行,因此我们再按图索骥找找其构造方法。


  1. /** 
  2.     * This constructor should ONLY be used when getting default values from 
  3.     * an XML preference hierarchy. 
  4.     * <p> 
  5.     * The {@link PreferenceManager#PreferenceManager(Activity)} 
  6.     * should be used ANY time a preference will be displayed, since some preference 
  7.     * types need an Activity for managed queries. 
  8.     */  
  9.    private PreferenceManager(Context context) {  
  10.        init(context);  
  11.    }  
  12.   
  13.    private void init(Context context) {  
  14.        mContext = context;  
  15.          
  16.        setSharedPreferencesName(getDefaultSharedPreferencesName(context));  
  17.    }  


  1. /** 
  2.      * Sets the name of the SharedPreferences file that preferences managed by this 
  3.      * will use. 
  4.      *  
  5.      * @param sharedPreferencesName The name of the SharedPreferences file. 
  6.      * @see Context#getSharedPreferences(String, int) 
  7.      */  
  8.     public void setSharedPreferencesName(String sharedPreferencesName) {  
  9.         mSharedPreferencesName = sharedPreferencesName;  
  10.         mSharedPreferences = null;  
  11.     }  


  1. private static String getDefaultSharedPreferencesName(Context context) {  
  2.        return context.getPackageName() + "_preferences";  
  3.    }  

由以上方法,我们可以知道,最终我们调用getSharedPreferences()方法得到的是一个名为”yourpackageName_preferences“的偏好。同时其mode为默认私有。

三、getDefaultSharedPreferences方法


  1. /** 
  2.     * Gets a SharedPreferences instance that points to the default file that is 
  3.     * used by the preference framework in the given context. 
  4.     *  
  5.     * @param context The context of the preferences whose values are wanted. 
  6.     * @return A SharedPreferences instance that can be used to retrieve and 
  7.     *         listen to values of the preferences. 
  8.     */  
  9.    public static SharedPreferences getDefaultSharedPreferences(Context context) {  
  10.        return context.getSharedPreferences(getDefaultSharedPreferencesName(context),  
  11.                getDefaultSharedPreferencesMode());  
  12.    }  
  13.   
  14.    private static String getDefaultSharedPreferencesName(Context context) {  
  15.        return context.getPackageName() + "_preferences";  
  16.    }  
  17.   
  18.    private static int getDefaultSharedPreferencesMode() {  
  19.        return Context.MODE_PRIVATE;  
  20.    }  

这个方法是静态的,因此可以直接调用,同时它与我们调用getSharedPreferences()方法得到的返回值是一样的,只是调用的方式不同罢了。

四、SharedPreferences到底是什么

它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下:


  1. SharedPreferences sharedPreferences = getSharedPreferences("TEST", Context.MODE_PRIVATE);  
  2. Editor editor = sharedPreferences.edit();//获取编辑器  
  3. editor.putString("name""Yang");  
  4. editor.putInt("sex""boy");  
  5. editor.commit();//提交修改  
生成的TEST.xml文件内容如下:

  1. <?xml version='1.0' encoding='utf-8' standalone='yes' ?>  
  2. <ma