Android SharedPreferences的理解与使用

本文详细介绍了Android中SharedPreferences的使用方式,包括获取SharedPreferences对象的三种方法、数据的存储与读取、删除与清空数据的步骤。此外,还讨论了SharedPreferences的内部工作原理,强调了其适合轻量级存储的特点以及在UI线程中使用可能导致的ANR问题。最后,建议在不关心提交结果时优先使用apply方法,以避免同步写入带来的性能影响。
摘要由CSDN通过智能技术生成

Android 五种数据存储的方式分别为:

  1. SharedPreferences:以Map形式存放简单的配置参数;
  2. ContentProvider:将应用的私有数据提供给其他应用使用;
  3. 文件存储:以IO流形式存放,可分为手机内部和手机外部(sd卡等)存储,可存放较大数据;
  4. SQLite:轻量级、跨平台数据库,将所有数据都是存放在手机上的单一文件内,占用内存小;
  5. 网络存储 :数据存储在服务器上,通过连接网络获取数据;

Sharedpreferences是Android平台上一个轻量级的存储类,用来保存应用程序的各种配置信息,其本质是一个以“键-值”对的方式保存数据的xml文件,其文件保存在/data/data//shared_prefs目录下。在全局变量上看,其优点是不会产生Application 、 静态变量的OOM(out of memory)和空指针问题,其缺点是效率没有上面的两种方法高。
1.获取SharedPreferences

要想使用 SharedPreferences 来存储数据,首先需要获取到 SharedPreferences 对象。Android中主要提供了三种方法用于得到 SharedPreferences 对象。
 1. Context 类中的 getSharedPreferences()方法:
 此方法接收两个参数,第一个参数用于指定 SharedPreferences 文件的名称,如果指定的文件不存在则会创建一个,第二个参数用于指定操作模式,主要有以下几种模式可以选择。MODE_PRIVATE 是默认的操作模式,和直接传入 0 效果是相同的。
 MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 这两种模式已在 Android 4.2 版本中被废弃。

1、Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写;
2、Context.MODE_WORLD_READABLE: 指定该SharedPreferences数据能被其他应用程序读,但不能写;
3、Context.MODE_WORLD_WRITEABLE: 指定该SharedPreferences数据能被其他应用程序读;
4、Context.MODE_APPEND:该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件;

2. Activity 类中的 getPreferences()方法:
 这个方法和 Context 中的 getSharedPreferences()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为 SharedPreferences 的文件名。

3. PreferenceManager 类中的 getDefaultSharedPreferences()方法:
 这是一个静态方法,它接收一个 Context 参数,并自动使用当前应用程序的包名作为前缀来命名 SharedPreferences 文件。
2.SharedPreferences的使用

SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。使用Preference来存取数据,用到了SharedPreferences接口和SharedPreferences的一个内部接口SharedPreferences.Editor,这两个接口在android.content包中;

1)写入数据:
//步骤1:创建一个SharedPreferences对象
SharedPreferences sharedPreferences= getSharedPreferences(“data”,Context.MODE_PRIVATE);
//步骤2: 实例化SharedPreferences.Editor对象
SharedPreferences.Editor editor = sharedPreferences.edit();
//步骤3:将获取过来的值放入文件
editor.putString(“name”, “Tom”);
editor.putInt(“age”, 28);
editor.putBoolean(“marrid”,false);
//步骤4:提交
editor.commit();

2)读取数据:
SharedPreferences sharedPreferences= getSharedPreferences(“data”, Context .MODE_PRIVATE);
String userId=sharedPreferences.getString(“name”,"");

3)删除指定数据
editor.remove(“name”);
editor.commit();

4)清空数据
editor.clear();
editor.commit();

5)写入数据:
//步骤1:创建一个SharedPreferences对象
SharedPreferences sharedPreferences= getSharedPreferences(“data”,Context.MODE_PRIVATE);
//步骤2: 实例化SharedPreferences.Editor对象
SharedPreferences.Editor editor = sharedPreferences.edit();
//步骤3:将获取过来的值放入文件
editor.putString(“name”, “Tom”);
editor.putInt(“age”, 28);
editor.putBoolean(“marrid”,false);
//步骤4:提交
editor.commit();

6)读取数据:
SharedPreferences sharedPreferences= getSharedPreferences(“data”, Context .MODE_PRIVATE);
String userId=sharedPreferences.getString(“name”,"");

7)删除指定数据
editor.remove(“name”);
editor.commit();

8)清空数据
editor.clear();
editor.commit();

注意:如果在 Fragment 中使用SharedPreferences 时,需要放在onAttach(Activity activity)里面进行SharedPreferences的初始化,否则会报空指针 即 getActivity()会可能返回null !

读写其他应用的SharedPreferences 步骤如下(未实践):
 1. 在创建SharedPreferences时,指定MODE_WORLD_READABLE模式,表明该SharedPreferences数据可以被其他程序读取;
 2. 创建其他应用程序对应的Context;
 3. 使用其他程序的Context获取对应的SharedPreferences;
 4. 如果是写入数据,使用Editor接口即可,所有其他操作均和前面一致;

try {
//这里的com.example.mpreferences 就是应用的包名
Context mcontext = createPackageContext(“com.example.mpreferences”, CONTEXT_IGNORE_SECURITY);

SharedPreferences msharedpreferences = mcontext.getSharedPreferences(“name_preference”, MODE_PRIVATE);
int count = msharedpreferences.getInt(“count”, 0);

} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}

try {
//这里的com.example.mpreferences 就是应用的包名
Context mcontext = createPackageContext(“com.example.mpreferences”, CONTEXT_IGNORE_SECURITY);

SharedPreferences msharedpreferences = mcontext.getSharedPreferences(“name_preference”, MODE_PRIVATE);
int count = msharedpreferences.getInt(“count”, 0);

} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}

SharedPreferences 的源码分析(API 25)

先从Context的getSharedPreferences开始:

public abstract SharedPreferences getSharedPreferences(String name, int mode);

我们知道Android中的Context类其实是使用了装饰者模式,而被装饰对象其实就是一个ContextImpl对象,ContextImpl的getSharedPreferences方法:

/**
 *
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值