您的位置:首页 > Web前端

sharedPreferences小记

2016-03-26 11:56 337 查看

一、获取sharedPreferences有两种方式

第一种是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文件。

第二种是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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: