博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 之 SharedPreferences应用
阅读量:6343 次
发布时间:2019-06-22

本文共 4909 字,大约阅读时间需要 16 分钟。

  Android 平台给我们提供了一个 SharedPreferences 类,它是一个轻量级的存储类,特别适合用于保存共享数据。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下。

  获取SharedPreferences的两种方式:调用Context对象的getSharedPreferences()方法;调用Activity对象的getPreferences()方法。

  两种方式的区别:

  调用Context对象的getSharedPreferences()方法获得的SharedPreferences对象可以被同一应用程序下的其他组件共享;

  调用Activity对象的getPreferences()方法获得的SharedPreferences对象只能在该Activity中使用。

  以下以 getSharedPreferences() 方式为示例:
SharedPreferences sharedPreferences = getSharedPreferences("xml_name", Context.MODE_PRIVATE);Editor editor = sharedPreferences.edit();//获取编辑器editor.putString("username", "zhangsan");editor.commit();//提交修改

  生成的 xml_name.xml 文件内容如下:

zhangsan

  getSharedPreferences(name,mode)方法的第一个参数用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上;第二个参数指定文件的操作模式。

  SharedPreferences 有以下四种操作模式:

  Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容;

  Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件;

  Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件;

  MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;

  MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。

  注意:Context.MODE_WORLD_READABLE 和 Context.MODE_WORLD_WRITEABLE 变量在API 17以后已经不建议使用了。创建全局可读文件是非常危险的事,这样会引起程序的安全漏洞。程序之间的交互应该更多的使用正规的途径,比如:ContentProvider, BroadcastReceiver, and Service。当程序通过备份和恢复后,并不能保证这种获取方式依然对该文件有效。文件创建模式:允许所有的其它程序来读取创建的文件。

  Context.MODE_MULTI_PROCESS

  在API11中添加,SharedPreferences加载标记:被设置后,在硬盘上的文件在被修改是将会被检查如果当前的SharedPreferences实例已经被加载进进程后。这种情况通常发生在,当程序有多个进程在修改同一个SharedPreferences文件的时候。通常来说这种方式在进程之间交互表现是非常好的。

  在API 2.3之前,发布release版本时,这个标记是默认存在的,当发布release版本时。对于使用2.3以上的sdk进行编译的时候,如果想使用那么必须明确的设置。

  getPreferences() - 如果你的Activity仅仅需要一个preferences文件可以使用这个方法。因为你的Activity只要一个preferences文件,所以不需要提供名字。

  使用方法 getXXX() 等方法读取。从SharedPreferences获取数据,示例如下:

SharedPreferences preferences=getSharedPreferences("xml_name", Context.MODE_PRIVATE);String username=preferences.getString("username", "defaultname");

  SharedPreferences 本身是一个接口,用来获取和修改程序的配置数据,位于:android.content.SharedPreferences。程序无法直接创建SharedPreferences实例,只能通过conext的getSharedPreferences(String, int)的获取接口实例。

  注意:当前类不支持跨进程调用,将会在之后的版本中支持。

  它提供了如下方法来访问 perferences 数据:

  boolean contains(String key) :判断当前preferences是否包含key所对应的数据。

  abstract SharedPreferences.Editor edit():为preferences创建一个新的Editor,因此你可以修改preferences的数据并且提交给SharedPreferences对象。

  abstract Map<String, ?> getAll() :获取preferences中所包含的所有数据。

  abstract XXX getXXX(String key, boolean defValue):获取perferences里指定的key对应的value。如果该key不存在,则返回默认defValue .其中XXX是基础数据类型:boolean、float、int、long、String等。

  SharedPreferences接口本身并没有提供写入数据的能力,而是通过SharedPreferences的内部接口,SharedPreferences调用edit()方法即可获取它所对应的Editor对象。

  Editor提供了如下方法来写向perferences入数据:

  abstract SharedPreferences.Editor clear()

  在Editor中标记出:清除所有preferences保存的数据。(注意此方法并没有实质性的清除,只是在Editor上进行了标记,需要commit后才可以进行真正的清除)

  abstract boolean commit():将Editor对preferences的修改提交给SharedPreferences对象,完成对preferences中数据的修改。

  abstract SharedPreferences.Editor putXXX(String key, boolean value)

  向preferences中存入key及其所对应的数据 <key-value>。其中xxx可以是boolean、float、int、long、String等各种基本类型的数值。

  abstract SharedPreferences.Editor remove(String key):

  在Editor中标记出preference中以key以键的键值对应该被移除,而实际的移除动作将会在commit()执行之后才会作用于真正的preferences。

   读取其它应用的SharedPreferences:

  如上所述,如果想读、写其它应用的SharedPreferences,前提是创建该SharedPreferences的应用程序指定相应的访问权限,例如指定了MODE_WORLD_READABLE , 这表明该SharedPreferences可被其它应用程序读取。指定了MODE_WORLD_WRITEABLE,这表明该SharedPreferences可被其它程序写入。

  为了读取其它程序对应的Context,可按照如下步骤进行:

  1、需要创建其它程序对应的Context,例如如下代码:

  Context userCount  = createPackageContext(“com.sharedpreferencesdemo.zhanggeng” , Context.CONTEXT_IGNORE_SECURITY);

  上面的程序中:com.sharedpreferencesdemo.zhanggeng 就是其他程序的包名——实际上Android系统就是用应用程序的包名来作为程序的标识的。

  2、调用其它程序的Conext的getSharedPreferences(String name , int mode) 即可获取相应的SharedPreferences对象。

  3、调用SharedPreferences的edit()方法获取相应的Editor即可。

private void readOtherAppSp() {          Context useCount = null;            try {              //获取其它程序对应的Context              useCount = createPackageContext("com.sharedpreferencesdemo.zhanggeng" , Context.CONTEXT_IGNORE_SECURITY);          } catch (PackageManager.NameNotFoundException e) {              e.printStackTrace();          }          //使用其它程序的Context获取对应的SharedPreferences          SharedPreferences prefs = useCount.getSharedPreferences("count" , Context.MODE_WORLD_READABLE);          //读取数据          int count = prefs.getInt("count" , 0);          //后续处理.....      }  

  正确的使用 SharedPreferences 总结以下几点注意:

  1、设置相应的权限:如果只供本程序或者有相同user id的程序使用,使用Context.MODE_PRIVATE权限;如果允许其它程序可读设置Context.MODE_WORLD_READABLE权限;如果允许其它程序可写设置Context.MODE_WORLD_WRITEABLE权限。

  2、SharedPreferences保存的数据最好是基础数据类型(当然也可以用来保存用户配置,官方推荐PreferenceActivtiy )。

  3、如果想让程序有多个preferences文件使用getSharedPreferences(xxx , xxx);如果想让程序只有一个preferences使用getPreferences()。

  4、SharedPreferences最好不要用来保存多个程序交互使用的共享数据,建议使用ContentProvider, BroadcastReceiver, and Service 来完成多个程序之间的数据共享。

转载地址:http://ytkla.baihongyu.com/

你可能感兴趣的文章
Windows 安装 Jenkins 2.6
查看>>
计算一个点是否在一个区域中
查看>>
正则表达式
查看>>
淘宝面试题:有一个一亿节点的树,现在已知两个点,找这两个点的共同的祖先。...
查看>>
EntityFramework 6.x多个上下文迁移实现分布式事务
查看>>
高版本SQL备份在低版本SQL还原问题
查看>>
一键安装最新内核并开启 BBR 脚本
查看>>
C# 绘制图表(柱状图,线性图,饼状图)
查看>>
.NET中使用Redis
查看>>
PHP 页面跳转的三种方式
查看>>
Juniper总结
查看>>
屏蔽scrollview的滚动
查看>>
面试题目3:智能指针
查看>>
取消凭证分解 (取消公司下的多个利润中心)
查看>>
flask ORM: Flask-SQLAlchemy【单表】增删改查
查看>>
vim 常用指令
查看>>
nodejs 获取自己的ip
查看>>
Nest.js 处理错误
查看>>
MD5的安全性
查看>>
你好,C++(16)用表达式表达我们的设计意图——4.1 用操作符对数据进行运算...
查看>>