一、SharedPreferences介绍:
2.它的实现例如官方文档给出如图:
3.它的内容描述如图:
【主要包括初始化、支持的键值对类型、存放和读取的方法】
二、跨进程使用的方式:
1.原理:
SharedPreferences在使用的时候,会在当前应用的apk的路径为:/data/data/包名/shared_prefs/设置的文件名.xml
如图为笔者所做项目用到的位置:
对于我们定义的文件,在另一个进程(如应用)中获取该文件,进行更新数据或者读取数据操作,实现数据的跨进程使用。
2.实现代码:
首先我们在主应用中实现一个工具类,例如我这里实现的:
import android.content.Context;
import android.content.SharedPreferences;
/**
* Created by fengjw on 2018/3/19.
*/
public class SettingPreference {
public static final String WALLPAPERSETTING = "wallpaper_setting";
public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE
+ Context.MODE_MULTI_PROCESS;
private Context mContext;
public SettingPreference(Context context){
mContext = context;
}
public String loadSharedPreferences(String key, String value){
SharedPreferences share = mContext.getSharedPreferences(WALLPAPERSETTING, MODE);
String tmp = share.getString(key, "default");
return tmp;
}
public int loadSharedPreferences(String key, int value){
SharedPreferences share = mContext.getSharedPreferences(WALLPAPERSETTING, MODE);
int tmp = share.getInt(key, -2);
return tmp;
}
public void saveSharedPreferences(String key, int value){
SharedPreferences share = mContext.getSharedPreferences(WALLPAPERSETTING, MODE);
SharedPreferences.Editor editor = share.edit();
editor.clear().putInt(key, value);
editor.commit();
}
public void saveSharedPreferences(String key, String value){
SharedPreferences share = mContext.getSharedPreferences(WALLPAPERSETTING, MODE);
SharedPreferences.Editor editor = share.edit();
editor.putString(key, value);
editor.commit();
}
}
我们定义了对两种键值对:string-string、string-int类型的数据的读写操作。
然后我们在另一个进程中使用当前进程的文件,我们再次定义一个工具类:
import android.content.Context;
import android.content.SharedPreferences;
/**
* Created by fengjw on 2018/3/20.
*/
public class SettingPreference {
public static final String WALLPAPERSETTING = "wallpaper_setting";
public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE
+ Context.MODE_MULTI_PROCESS;
private String PACKAGE_NAME = "包名";//如:com.fengjw.wallpapermarket
private Context mContext;
public SettingPreference(Context context){
try {
mContext = context.createPackageContext(PACKAGE_NAME, Context.CONTEXT_IGNORE_SECURITY);
}catch (Exception e){
e.printStackTrace();
}
}
public int loadSharedPreferences(String key, int value){
SharedPreferences share = mContext.getSharedPreferences(WALLPAPERSETTING, MODE);
int tmp = share.getInt(key, -2);
return tmp;
}
public String loadSharedPreferences(String key, String value){
SharedPreferences share = mContext.getSharedPreferences(WALLPAPERSETTING, MODE);
String tmp = share.getString(key, "default");
return tmp;
}
public void saveSharedPreferences(String key, int value){
SharedPreferences share = mContext.getSharedPreferences(WALLPAPERSETTING, MODE);
SharedPreferences.Editor editor = share.edit();
editor.clear().putInt(key, value);
editor.commit();
}
public void saveSharedPreferences(String key, String value){
SharedPreferences share = mContext.getSharedPreferences(WALLPAPERSETTING, MODE);
SharedPreferences.Editor editor = share.edit();
editor.putString(key, value);
editor.commit();
}
}
这里需要注意对于配置文件的调用操作,我们的Context不能直接获取当前应用的,而要获取之前进程的Context。
另外一个需要注意的地方为AndroidManifest.xml文件,我们要设置统一的sharedUserId,来保持通信的畅通。
笔者开发均为系统预装应用,所以使用的均为系统UID,例如:
android:sharedUserId="android.uid.system"
官方文档中阐述SharedPreferences操作是一个耗时操作,从性能角度考虑不是很建议进程进程间的使用;同时进程间使用存在一定程度的通信障碍,例如内存不足的时候,跨进程通信过于频繁可能导致出现数据读取上的错误。