「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战」
轻量级存储类,原理是通过Android系统生成一个xml文件保存至:/data/data/包名/shared_prefs目录下,以键值对的方式来存储数据。
简介
获取SharedPreferences的两种方式
- getSharedPreferences()
SharedPreferences sharedPreferences =
context.getSharedPreferences("file_key", Context.MODE_PRIVATE);
可通过第一个参数指定访问的文件。
mode:
MODE_PRIVATE,只能被本应用使用;
MODE_WORLD_READABLE,可被其他应用读;
MODE_WORL_WRITEABLE,可被其他应用读写。
- getPreferences()
默认使用当前类名(不带包名)作为文件名
SharedPreferences sharedPreferences1 =
this.getPreferences(Context.MODE_PRIVATE);
读写SharedPreferences
写
为了写SharedPreferences,需要执行edit()床间一个SharedPreferences.Editor对象,通过类似putInt或putString等方法传递key/value,后通过commit提交变更
SharedPreferences sharedPreferences = this.getSharedPreferences("file_key", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt("key", 1024);
editor.commit();
读
int targetValue = sharedPreferences.getInt("key", -1);
//第二个值为默认值
其他应用访问
1.创建一个指向目标应用的Context
try {
Context otherAppContext = createPackageContext("包名", CONTEXT_IGNORE_SECURITY);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
2.通过Context获取SharedPreferences
SharedPreferences sharedPreferences =
otherAppContext.getSharedPreferences("file_key", Context.MODE_PRIVATE);
补充
工作原理
1.判断是否存在xml文件,若不存在,创建;若存在,通过IO读取文件,通过xmlUtil解析,保存至一个Map对象中
2.读取数据时,从内存中的Map对象中读取
3.写入数据时,先写入内存Map对象中,后Map对象写入xml文件中
commit和apply
commit方法执行写入内存后,同步写入磁盘,并返回操作结果。
apply方法执行写入内存后,使用一部Runnable写入磁盘,不返回操作结果。
多进程
由于进程间是不能内存共享的,每个进程操作的SharedPreferences都是一个单独的实例,上述的问题并不能通过锁来解决,这导致了多进程间通过SharedPreferences来共享数据是不安全的,这个问题只能通过多进程间其它的通信方式或者是在确保不会同时操作SharedPreferences数据的前提下使用SharedPreferences来解决。
\