sharedPreferences小记

来源:互联网 发布:新威胜电能表调试软件 编辑:程序博客网 时间:2024/06/05 15:52

一、获取sharedPreferences有两种方式

  1. 第一种是getSharedPreferences(name,int),第一个参数是Preferences文件的名称,第二个参数是获取的方式(有三种,0或MODE_PRIVATE表示默认方式,在这个方式下,只允许本应用可以使用该Preferences文件;MODE_WORLD_READABLE及MODE_WORLD_WRITEABLE在API17的时候已经被遗弃。还有一个值是MODE_MULTI_PROCESS。所以一般情况下传入第二个参数传入0 设置了MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE之后,可以通过其它app来读取和修改该sharedPreferences文件;设置了MODE_MULTI_PEOCESS后,可以在多进程中读写改sharedPreferences文件。
  2. 第二种是getPreferences().这种方式不用传递参数,会以当前activity的名字来取得Preferences文件的名字。

二、操作获取的Preferences文件

在获取到Preferences文件后,可以直接执行getString(key,defauly)等方法,获取保存的值;其中第一个参数为key值,第二个参数为取不到时的默认值。
通过Preferences.edit()方法获取一个SharedPreferences.Editor的对象实例,然后通过一系列put方法,可像文件中写入boolean、float、int、long、string、stringSet类型的值;同时可以remove(Key)删除一个,clear()删除全部。其中put和remove、clear方法,需要调用apply或commit方法后才可以生效。

// 写入文件SharedPreferences spf = getSharedPrefereneces("test",0)SharedPreferences.editor edit = spf.edit();edit.putString("testKey","nihao");edit.commit();// 读取文件内容SharedPreferences spf = getSharedPreferences("test",0);String temp = spf.getString("testKey");

三、sharedPreferences文件的存储位置

通过sharedPreferences存储的内容都是以xml文件的格式存储在手机中的,具体的路径为:/data/data/应用程序包/shared_prefs。通过adb shell命令能够进入到对应的此路径中,并可以通过命令cat my.xml命令来查看文件中的内容(手机root之后才可进入到shared_prefs文件夹中,否则是没有权限的),文件中内容格式如下所示:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>  <map>  <int name="position" value="6" />  <boolean name="bgImageFlg" value="false" />  <int name="textColor" value="-1339948835" />  <int name="mPositionDongwu" value="4" />  <int name="mPositionFuqi" value="5" />  <boolean name="noTitle" value="true" />  <boolean name="fontBold" value="true" />  <boolean name="fullScreen" value="true" />  <int name="mainBgColor" value="-17204" />  <int name="colorFlg" value="2" />  </map>  

三、commit和apply的区别

  • commit()方法是同步方法,并且会返回成功失败的标记
  • apply 并为异步方法,提交会先放到内存中,在以异步的方式将内存数据存储到xml文件中。所以如果不关心是否存储成功,并且是在主线程内,则可以使用apply来替代commit方法。
  • 当使用commit提交的时候,如果对同一个文件apply提交并没有完成,则此时commit提交会被阻塞,直到apply方式的异步提交完成。

四、跨app访问sharedPreferences文件

在上边一中说到,当将访问模式设置为MODE_WORLD_READABLE及MODE_WORLD_WRITEABLE在API17或MODE_MULTI_PROCESS时,可以在多进程中访问该sharedPreferences文件,然而并不是这样的(貌似这个参数并没有起到作用)。想在其他app中访问该sharedPreferences文件,需要两个app共享一个userId。比如两个apk的包名分别为:com.example.baidu.testpreferences及com.example.baidu.sharedprocess,需要在sharedprocess访问testpreferences中创建的sharedPreferences文件,则两者的配置文件可变为:

<!--testpreferences中的配置:--><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.baidu.testpreferences"    android:sharedUserId="com.example">    ....</manifes><!--sharedPreferences中的配置:--><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.baidu.sharedprocess"    android:sharedUserId="com.example">    ...</manifes>

在上边配置的基础上,写入及读出文件

// 在sharedPreferences写入数据SharedPreferences settings = getSharedPreferences("test", 0);SharedPreferences.Editor editor = settings.edit();editor.putString("1", "dai");editor.apply();// 在testpreferences读取数据try {    Context otherContext = createPackageContext("com.example.baidu.testpreferences", CONTEXT_IGNORE_SECURITY);    SharedPreferences settings = otherContext.getSharedPreferences(NAME, 0);    String str = settings.getString("1", "peng");    Log.d("daipeng", str);} catch (PackageManager.NameNotFoundException e) {    e.printStackTrace();}

但是采用上述方法,有一个问题,就是当创建sharedPreferences方对其进行的修改,并不能实现实时的跟新,在获取时,还是原来缓存的值。要想实现实时更新,需要在创建和读取sharedPreferences文件时,采用MODE_MULTI_PROCESS模式,即上面代码变为:

// 在sharedPreferences写入数据SharedPreferences settings = getSharedPreferences("test", MODE_MULTI_PROCESS);SharedPreferences.Editor editor = settings.edit();editor.putString("1", "dai");editor.apply();// 在testpreferences读取数据try {    Context otherContext = createPackageContext("com.example.baidu.testpreferences", CONTEXT_IGNORE_SECURITY);    SharedPreferences settings = otherContext.getSharedPreferences(NAME, MODE_MULTI_PROCESS);    String str = settings.getString("1", "peng");    Log.d("daipeng", str);} catch (PackageManager.NameNotFoundException e) {    e.printStackTrace();}

上述两种方式都可以在读取方对sharedPreferences文件进行写入和修改操作。

五、同一app内部跨进程访问同一sharedPreferences文件

在app内部可以开启多个进程,方式是在activity中进行设置:

<activity android:name=".Main2Activity"            android:process=":sevice"></activity>

完成上述设置后,Main2Activity会在进程com.example.baidu.testpreferences:sevice中运行。在这种情况下,读写同一sharedPreferences是没有任何问题的,与模式并没有关系(发现MODE_WORLD_READABLE及MODE_WORLD_WRITEABLE真的是一点鸟用都没有,可能是很早就被遗弃的原因)。
但是此时,并不能实现实时的更新,在写数据方修改数据后,读数据的进程中并不能访问到最新数据,仍然是缓存中的旧数据;若想实现这一功能,和标题四中的内容一样,需要设置模式为 MODE_MULTI_PROCESS

0 0
原创粉丝点击