SharedPreferences类提供了一些大体框架,允许你保存和获取由基本数据类型组成的持久键值对。你能使用SharedPreferences保存一些基本数据:booleans, floats, ints, longs, and strings.这些数据将持久存在用户的会话(甚至你的应用程序被杀死)
对于SharedPreferences类的描述:
/**
* Interface for accessing and modifying preference data returned by {@link
* Context#getSharedPreferences}. For any particular set of preferences,
* there is a single instance of this class that all clients share.
* Modifications to the preferences must go through an {@link Editor} object
* to ensure the preference values remain in a consistent state and control
* when they are committed to storage.
*
* <p><em>Note: currently this class does not support use across multiple
* processes. This will be added later.</em>
*/
用于访问和修改Context.getSharedPreferences(String, int)返回的偏好设置数据的一个接口。对于任何一个特殊的
preferences,所有客户端共享这个此类单一的实例。修改preferences必须通过SharedPreferences.Editor 对象,以
确保当他们提交存储数据操作时,preferences值保持一致状态。
注意:目前,这个类不支持多线程访问,留待以后添加。
使用两种方法其中之一,可以获取你应用程序的SharedPreferences对象:
1、getSharedPreferences(String, int) -- 使用此方法你需要多个preferences文件中指定文件名,也就是指定的第一个参数。
2、getPreferences() -- 使用此方法如果在你的Activity中只需要一个preferences文件,因为这将是唯一的preferences文件在你的Activity中,你不需要提供名称。
获取SharedPreferences对象后,就是写入值:
1、 回调edit()获取一个SharedPreferences.Editor对象
2、 添加值方法比如:putBoolean()/putString()
3、 提交新值对象调用commit()方法
核心原理:
保存基于XML文件存储的Key-Value键值对数据,通常用来存储一些简单的配置信息。通过File Explorer,SharedPreferences数据总是存储在/data/data/<package name>/shared_prefs目录下
如下图:
SharedPreferences对象本身只能获取数据不支持存储和修改,存储修改是通过SharedPreferences.Edit对象实现的。SharedPreferences本身是一个接口程序,无法直接创建SharedPreferences实例,只能通过提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences对象,该方法中name表示要操作的xml文件名,第二参数具体如下:
Context.MODE_PRIVATE:指定该SharedPreferences数据只能被本应用程序读、写。
Context.MODE_WORLD_READABLE:指定该SharedPreferences数据能被其他应用程序读,但不能写。
Context.MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序读、写。
Editor主要方法:
SharedPreferences.Editor clear(): 清空SharePreferences所有数据
SharedPreferences.Editor putXxx(String key,String value): 向SharedPreferences存入指定key对应的数据,其中Xxx为基本数据类型:boolean,int,float等或String,StringSet
SharedPreferences.Editor remove(String key): 删除SharedPreferences指定key对应的数据项
boolean commit(): 当Editor编辑完成后,提交修改。
// 记录存储数据类
public class RmsDataBase {
private String dbname_;
private Activity app_;
private SharedPreferences store_;
public RmsDataBase(Activity app, String dbName) {
this.dbname_ = dbName;
this.app_ = app;
this.store_ = app_.getSharedPreferences(dbname_, Context.MODE_PRIVATE);
// this.store_ = app_.getSharedPreferences(dbname_, Context.MODE_WORLD_READABLE); // 其他程序可以访问读取
}
public String getDBName(){
return dbname_;
}
/**
* 移除数据表
*/
public void deteleDB(){
store_.edit().remove(dbname_);
}
/**
* 获取数据
* @param key
* @return
*/
public String get(String key) {
String value = null;
try {
value = store_.getString(key, "");
} catch (Exception e) {
e.printStackTrace();
} finally {}
return value;
}
/**
* 存储键值对
* @param key
* @param value
*/
public void save(String key, String value) {
try {
SharedPreferences.Editor editor = store_.edit();
editor.putString(key, value);
editor.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {}
}
/**
* 删除键值对
* @param key
*/
public void delete(String key) {
try {
SharedPreferences.Editor editor = store_.edit();
editor.remove(key);
editor.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {}
}
}
// 对数据进行处理测试
public class MainActivity extends Activity {
LinearLayout ll_;
RmsDataBase rmsDB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_sharedpreferences);
ll_ = (LinearLayout) findViewById(R.id.ll_content);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
addData();
}
});
findViewById(R.id.button2).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
getData();
}
});
rmsDB = new RmsDataBase(this, getLocalClassName());
// 调用其他应用程序的SharedPreferences文件
/*try {
Context context = createPackageContext("访问应用程序包名", CONTEXT_IGNORE_SECURITY);
SharedPreferences sp = context.getSharedPreferences("访问应用程序的文件名", Context.MODE_WORLD_READABLE);
// ...其他都一样
} catch (NameNotFoundException e) {
e.printStackTrace();
}*/
}
public void addData(){
System.out.println("------ >>>> " + rmsDB.getDBName());
rmsDB.save("name", "john");
rmsDB.save("age", "18");
}
public void getData(){
String name = rmsDB.get("name");
String age = rmsDB.get("age");
System.out.println("------ >>>> " + name);
System.out.println("------ >>>> " + age);
}
}
读写其他应用程序的SharedPreferences:
1、在创建SharedPreferences时、指定
MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE,表明可读取,写入
this.store_ = app_.getSharedPreferences(dbname_, Context.MODE_WORLD_READABLE); // 其他程序可以访问读取
2、创建其他程序对应的Context:
Context context = createPackageContext("访问应用程序包名", Context.CONTEXT_IGNORE_SECURITY);
3、使用访问程序的Context获取SharedPreferences对象
SharedPreferences sp = context.getSharedPreferences("访问应用程序的文件名", 1);
4、 其他操作同操作自己应用程序SharedPreferences一样