有时应用程序有少量的数据需要保存,而且这些数据的格式很简单,都是普通的值,比如应用程序的各种配置信息(如是否打开音效,是否使用振动效果等,小游戏的玩家积分等),对于这种数据,就可以采用SharedPreferences保存的数据.并且它主要是类似于配置信息格式的数据,因此它保存的数据主要是简单类型的key-value对。
1)SharePreferences接口负责读取应用程序的Preferences的数据,提供了一些方法:
boolean contains(String key):是否包含该key数据
Map<String,?>getAll():获取全部的key-value
对boolean getXxx(String key,xxx defValue):获取指定key对应的value.
注意:1)Xxx是各种基本数据类型,如int,long
2)当文件不存在,获取key不存在,getXxx代码不会报错。
2)SharePreferences接口本身没有提供写入数据的能力,而是通过SharedPreferences
的内部接口Editor.Editor提供了如下方法:
clear():清空所有数据
putXxx(String key,Xxx value):存入指定key对应的数据
remove(String key):删除指定key对应的数据项
commit():当Editor编辑完成后,调用该方法提交修改
3)SharePreferences本身是一个接口,无法直接创建该实例,只能通过Context获取SharePreferences实例对象:SharePreferences preference =
context.getSharePreferences(name,mode);
注意:第二个参数支持如下几个值
Context.MODE_PRIVATE:指定该SharedPrefereces数据只能被本应用程序读写
Context.MODE_WORLD_READABLE:指定该SharedPrefereces数据能被其他应用程序读,但不能写,过时了
Context.MODE_WORLD_WRITEABLE:指定该SharedPrefereces数据能被其他应用程序读写,过时了,不安全
4)获取SharePreferences.Editor实例对象:Editor edit = preference.edit()
5)存放文件的路径:/data/data/package name/shared_prefs/name.xml
注意保存文件数据的格式
6)读写其他应用程序的SharedPreferences的数据的步骤:
a)需要创建其他程序对应的Context对象
Context c=createPackageContext(“包名”,
Context.CONTEXT_IGNORE_SECURITY);
b)获取其他程序的SharedPreferences对象
c.getSharedPrefereces(String,Context.MODE_MULTI_PROCESS)
//Context.MODE_WORLD_READABLE+ Context.MODE_WORLD_WRITEABLE
c)使用其他程序的SharedPreferences对象读写数据
getXxx,edit(),putXxx()
package com.xspacing.sharedpreference;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import com.xspacing.sharedpreference.R;
public class MainActivity extends Activity {
private EditText mEtSave;
private TextView mTvRead;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
mEtSave = (EditText) findViewById(R.id.et_save);
mTvRead = (TextView) findViewById(R.id.read_tv);
}
/**
* 保存数据
*
* @param v
*/
public void save(View v) {
String value = mEtSave.getText().toString();
SharedPreferences sp = this.getSharedPreferences("config", Context.MODE_PRIVATE);
Editor edit = sp.edit();
edit.putString("key", value);
edit.commit();
}
/**
* 读取数据
*
* @param v
*/
public void read(View v) {
SharedPreferences sp = this.getSharedPreferences("config", Context.MODE_PRIVATE);
String value = sp.getString("key", "");
mTvRead.setText(value);
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.xspacing.sharedpreference.MainActivity" >
<EditText
android:id="@+id/et_save"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="save"
android:text="保存" />
<TextView
android:id="@+id/read_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="read"
android:text="读取" />
LinearLayout>
将SharedPreference写成一个工具类,方便在开发中使用
package com.xspacing.sharedpreference;
import java.util.Map;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
/**
* @ClassName SPUtils.java
* @Description sharedpreference工具类
* @author smile
* @version v1.0
* @date 2016年10月17日
*/
public class SPUtils {
public static final String SP_NAME = "config";
public static final int SP_MODE = Context.MODE_PRIVATE;
/**
* 保存数据
*
* @param ctx
* @param key
* @param obj
*/
public static void put(Context ctx, String key, Object obj) {
SharedPreferences sp = ctx.getSharedPreferences(SP_NAME, SP_MODE);
Editor edit = sp.edit();
if (obj instanceof Boolean) {
edit.putBoolean(key, (Boolean) obj);
} else if (obj instanceof Float) {
edit.putFloat(key, (Float) obj);
} else if (obj instanceof Integer) {
edit.putInt(key, (Integer) obj);
} else if (obj instanceof Long) {
edit.putLong(key, (Long) obj);
} else if (obj instanceof String) {
edit.putString(key, (String) obj);
}
edit.commit();
}
/**
* 获取指定数据
*
* @param ctx
* @param key
* @param defaultObj
* @return
*/
public static Object get(Context ctx, String key, Object defaultObj) {
SharedPreferences sp = ctx.getSharedPreferences(SP_NAME, SP_MODE);
if (defaultObj instanceof Boolean) {
return sp.getBoolean(key, (Boolean) defaultObj);
} else if (defaultObj instanceof Float) {
return sp.getFloat(key, (Float) defaultObj);
} else if (defaultObj instanceof Integer) {
return sp.getInt(key, (Integer) defaultObj);
} else if (defaultObj instanceof Long) {
return sp.getLong(key, (Long) defaultObj);
} else if (defaultObj instanceof String) {
return sp.getString(key, (String) defaultObj);
}
return null;
}
/**
* 删除指定的数据
*
* @param ctx
* @param key
*/
public static void remove(Context ctx, String key) {
SharedPreferences sp = ctx.getSharedPreferences(SP_NAME, SP_MODE);
Editor edit = sp.edit();
edit.remove(key).commit();
}
/**
* 获取所有的键值对
*
* @param ctx
* @return
*/
public static Map getAll(Context ctx) {
SharedPreferences sp = ctx.getSharedPreferences(SP_NAME, SP_MODE);
return sp.getAll();
}
/**
* 清除所有的数据
*
* @param ctx
*/
public static void clear(Context ctx) {
SharedPreferences sp = ctx.getSharedPreferences(SP_NAME, SP_MODE);
Editor edit = sp.edit();
edit.clear().commit();
}
/**
* 检查key对应的数据是否存在
*
* @param ctx
* @param key
* @return
*/
public static boolean contains(Context ctx, String key) {
SharedPreferences sp = ctx.getSharedPreferences(SP_NAME, SP_MODE);
return sp.contains(key);
}
}