一句话概括
SharedPreferences在android中主要以xml文件的方式保存较小的键值对。
1.SharedPreferences介绍
在android中,保存较小的android键值对,主要可以保存的数据类型有:
- String
- Float
- Boolean
- Int
- Long
- StringSet Set集合,泛型为String
2.保存形式
SharedPreferences以xml的形式保存在 data/data/包名/shared_prefs 这个目录下,
具体情况大概是以下情况:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="name">nick</string>
<int name="age" value="18" />
<float name="high" value="1.8" />
<boolean name="isBoy" value="true" />
<long name="ID" value="123456789999999" />
<set name="setString">
<string>1</string>
<string>2</string>
<string>3</string>
<string>4</string>
</set>
</map>
3.存储方式
一个超级简单的例子:
SharedPreferences sp = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
edit.putString("key", "value");
edit.apply();
解释:
getPreferences(int mode)这个方法是Context的方法,所以可以在activity中使用,
可以理解为打算要创建一个名字为:当前Activity名字.xml
的文件,
sp.edit();这是向当前的sp要一个编辑器,以便给它加入键值对。
Editor的用法类似map,以put的形式赋值。
edit.apply(),表示提交。完成这一步,xml才会真正的创建。
关于获取SharedPreferences其实有2种方式:
getPreferences(int mode)
getSharedPreferences(String name, int mode)
mode这个参数我们待会讲,我们先看有name这个参数和没有name这个参数有什么区别
name这个参数其实就是给xml文件取名字,例如以下代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getPreferences(MODE_PRIVATE).edit().apply();
getSharedPreferences("haha", MODE_PRIVATE).edit().apply();
}
那么在文件夹下面就会创建这2个xml文件
mode这个参数,也就是使用模式,有4种使用模式
- MODE_PRIVATE
- MODE_APPEND
- MODE_WORLD_READABLE
- MODE_WORLD_WRITEABLE
但是下面两种已经过时了,Google官方不推荐使用,因为不安全,别人就可以读写这个文件了。
我们来看看前面两种。官方解释:
MODE_PRIVATE:该模式下,创建的文件只能被本应用访问
MODE_APPEND:该模式下,如果文件已经存在,则将数据写入现有文件的结尾,而不是擦除它.。
其实我感觉这两个模式没啥区别。
接下来我们看看提交的方式,其实也有两种:
- edit.apply();
- edit.commit();
这两种提交方式是有区别的
apply()这种的效率要高些,而且没有返回值。提交了后不需要关心是否提交成功,反正老子提交了。
commit()这种的效率就要低一些的,有一个boolean返回值,true就提交成功了,false就提交失败了,如果有多个edit同时提交,系统只认最后一个。
4.获取方式
SharedPreferences的获取方式更加简单,上代码:
SharedPreferences sp = getPreferences(MODE_PRIVATE);
String string = sp.getString("key", "default");
你没看错,就只有两行代码,getString(“key”,”default”),第一次参数为保存时候的key值,第二个参数为默认值,当没有获取到数据的时候,会启动默认值。这是防止自己傻逼忘了存储值就开始取值了。
5.方式技巧
以上我已经把基本的使用当时都说了,现在该说说,平时我怎么用他了。
首先写一个工具类,代码有点多,我就直接拷了:
package com.qxf.archer.sharedpreferencesdemo;
import android.content.Context;
import android.content.SharedPreferences;
/**
* 类描述:
* <p>
* 作者:Administrator on 2017/1/12 0012 01:25
* 邮箱:377289596@qq.com
*/
public class SharedPreferencesUtils {
/**
* 上下文
*/
private static Context mContext;
/**
* 初始化SharedPreferences,必须使用该方法
*/
public static void init(Context context) {
mContext = context;
}
/**
* 抛出异常
*/
private static void throwInit(){
if (mContext == null) {
throw new NullPointerException("在使用该方法前,需要使用init()方法,推荐将init()放入Application中");
}
}
/**
* 插入字符串
* @param name 文件名
* @param key key
* @param value 值
*/
public static void putString(String name, String key, String value) {
throwInit();
SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
edit.putString(key, value);
edit.apply();
}
/**
* 获取字符串
* @param name 文件名
* @param key key
* @param defaultValue 没获取到时的默认值
* @return 字符串
*/
public static String getString(String name, String key, String defaultValue) {
throwInit();
SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
return sp.getString(key, defaultValue);
}
/**
* 插入整型
* @param name 文件名
* @param key key
* @param value 值
*/
public static void putInt(String name, String key, int value) {
throwInit();
SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
edit.putInt(key, value);
edit.apply();
}
/**
* 获取整型
* @param name 文件名
* @param key key
* @param defaultValue 没获取到时的默认值
* @return 整型
*/
public static int getInt(String name, String key, int defaultValue) {
throwInit();
SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
return sp.getInt(key, defaultValue);
}
/**
* 插入浮点型
* @param name 文件名
* @param key key
* @param value 值
*/
public static void putFloat(String name, String key, float value) {
throwInit();
SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
edit.putFloat(key, value);
edit.apply();
}
/**
* 获取浮点型
* @param name 文件名
* @param key key
* @param defaultValue 没获取到时的默认值
* @return 浮点型
*/
public static float getFloat(String name, String key, float defaultValue) {
throwInit();
SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
return sp.getFloat(key, defaultValue);
}
/**
* 插入Long型
* @param name 文件名
* @param key key
* @param value 值
*/
public static void putLong(String name, String key, long value) {
throwInit();
SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
edit.putLong(key, value);
edit.apply();
}
/**
* 获取长整型
* @param name 文件名
* @param key key
* @param defaultValue 没获取到时的默认值
* @return 长整型
*/
public static float getLong(String name, String key, long defaultValue) {
throwInit();
SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
return sp.getLong(key, defaultValue);
}
/**
* 插入boolean型
* @param name 文件名
* @param key key
* @param value 值
*/
public static void putBoolean(String name, String key, boolean value) {
throwInit();
SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
edit.putBoolean(key, value);
edit.apply();
}
/**
* 获取布尔型
* @param name 文件名
* @param key key
* @param defaultValue 没获取到时的默认值
* @return 布尔型
*/
public static boolean getBoolean(String name, String key, boolean defaultValue) {
throwInit();
SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
return sp.getBoolean(key, defaultValue);
}
}
使用方式:
1.首先创建一个MyApplication,继承自Application,并且在清单文件里面声明好,如下:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:name=".MyApplication"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
2.在自己创建的application中的oncreate方法中写如下:
@Override
public void onCreate() {
super.onCreate();
SharedPreferencesUtils.init(this);
}
3.创建一个Constants类,主要记录常量,可以在里面规定文件名字,key什么的,为的是保证自己不把key写错,例如:
public class Constants {
/**
* xml文件名
*/
public static final String SHARD_NAME = "a1";
public static final String SHARD_NAME_STRING = "string";
public static final String SHARD_NAME_INT = "int";
public static final String SHARD_NAME_FLOAT = "float";
public static final String SHARD_NAME_LONG = "long";
public static final String SHARD_NAME_BOOLEAN = "boolean";
}
接下来就可以开始使用了:
布局,今天他长这样:
然后,MainActivity.java
package com.qxf.archer.sharedpreferencesdemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button jump;
private Button addString;
private Button addInt;
private Button addLong;
private Button addFloat;
private Button addBoolean;
private Button checkAll;
private TextView show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
SharedPreferencesUtils.getBoolean("asdas", "as", true);
}
private void initView() {
addString = (Button) findViewById(R.id.addString);
addInt = (Button) findViewById(R.id.addInt);
addLong = (Button) findViewById(R.id.addLong);
addFloat = (Button) findViewById(R.id.addFloat);
addBoolean = (Button) findViewById(R.id.addBoolean);
checkAll = (Button) findViewById(R.id.checkAll);
show = (TextView) findViewById(R.id.show);
addString.setOnClickListener(this);
addInt.setOnClickListener(this);
addLong.setOnClickListener(this);
addFloat.setOnClickListener(this);
addBoolean.setOnClickListener(this);
checkAll.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.addString:
SharedPreferencesUtils.putString(Constants.SHARD_NAME,
Constants.SHARD_NAME_STRING, "字符串");
break;
case R.id.addInt:
SharedPreferencesUtils.putInt(Constants.SHARD_NAME,
Constants.SHARD_NAME_INT, 10);
break;
case R.id.addLong:
SharedPreferencesUtils.putLong(Constants.SHARD_NAME,
Constants.SHARD_NAME_LONG, 12345678999999L);
break;
case R.id.addFloat:
SharedPreferencesUtils.putFloat(Constants.SHARD_NAME,
Constants.SHARD_NAME_FLOAT, 3.14f);
break;
case R.id.addBoolean:
SharedPreferencesUtils.putBoolean(Constants.SHARD_NAME,
Constants.SHARD_NAME_BOOLEAN, true);
break;
case R.id.checkAll:
String aString = SharedPreferencesUtils
.getString(Constants.SHARD_NAME, Constants.SHARD_NAME_STRING, "默认值");
int anInt = SharedPreferencesUtils
.getInt(Constants.SHARD_NAME, Constants.SHARD_NAME_INT, -1);
float aLong = SharedPreferencesUtils
.getLong(Constants.SHARD_NAME, Constants.SHARD_NAME_LONG, -1L);
float aFloat = SharedPreferencesUtils
.getFloat(Constants.SHARD_NAME, Constants.SHARD_NAME_FLOAT, -1.0f);
boolean aBoolean = SharedPreferencesUtils.getBoolean(Constants
.SHARD_NAME, Constants.SHARD_NAME_BOOLEAN, false);
String result = aString + "\n" + anInt
+ "\n" + aLong + "\n" + aFloat + "\n" + aBoolean;
show.setText(result);
break;
}
}
}
如果要添加key就直接在constants这个类里面添加就行了,是不是很简单,虽然工具类很长,但是以后使用起来就特别简单了,特别是要经常使用sharedpreferences的时候。