sharedPreferences小记

一、获取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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值