SharedPreferences的用法及指南

一句话概括

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
 * 邮箱:[email protected]
 */

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

猜你喜欢

转载自blog.csdn.net/it_xf/article/details/54356993
今日推荐