一句话概括

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">nickstring>    <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>1string>        <string>2string>        <string>3string>        <string>4string>    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;/** * 类描述: * 

* 作者: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的时候。

源码下载:http://download.csdn.net/detail/it_xf/9735337

更多相关文章

  1. Android请求网络有三种方式:HttpURLConnection、 HttpClient和OkH
  2. Android动态加载――加载已安装APK中的类
  3. Android(安卓)7+的一些报错
  4. Android(安卓)截取屏幕图片并保存
  5. 申请Android(安卓)Map 的API Key(v2)的最新申请方式(SHA1密钥)
  6. context对于android的重要意义
  7. 获取android手机内部存储空间和外…
  8. Android三种播放视频的方式
  9. 再谈 android 设备SN的获取 续 android 设备唯一码的获取,Cpu号,Ma

随机推荐

  1. Android学习笔记之mainfest文件中android
  2. Android(安卓)使用com.j256.ormlite
  3. Android给View画边框
  4. android 动画总结
  5. android资料下载地址汇总
  6. Android获取本机Mac地址和IP地址
  7. Android(安卓)dependency ‘androidx.cor
  8. Android(安卓)SQLite是线程安全的吗?
  9. android viewholder
  10. android EditText 去除边框