SharedPreferences的用法及指南

Android性能优化之SharedPreferences Android 存储优化系列专题 SharedPreferences 系列 《Android 之不要滥用 SharedPreferences》 《Android 之不要滥用 SharedPreferences(2)— 数据丢失》 ContentProvider 系列(待更) 《Android 存储选项之 ContentProvider 启动过程源码分析》 《Android 存储选项之 ContentProvider 深入分析》 对象序列化系列 《Android 对象序列化之你不知道的 Serializab. 阅读详情

一句话概括

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的时候。

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

SharedPreferences 使用详解 和你一起终身学习,这里是程序员Android经典好文推荐,通过阅读本文,您将收获以下知识点:一、 SharedPreferences 简介二、SharedPreferences 保存数据的方法三、SharedPreferences读取数据的方法四、总结SharePerference Utils 封装类使用方法五、SharedPreferences 数据保存位置一、 SharedPreference... 阅读详情

相关推荐

Android 中SharedPreferences的详解

一、SharedPreferences 首选项 介绍 存储软件的配置信息 存储的信息:很小,简单的数据;比如:自动登录,记住密码,小说app(返回后再次进入还是 原来看的页数),按钮的状态。 特点:当程序运行首选项里面的数据会全部加载进内容。 二、SharedPreferences的简单使用 1.布局文件中,写入两个按钮,保存到SP,和从SP中获取数据 布局代码的文件就不再写了。 2.看MainActivity的代码,里面有注释详解 package com.example.spdemo; import

路宇的博客 1万+

SharedPreferences详解

SharedPreferencesImpl实现类 构造方法中。SharedPreferencesImpl实现类。startLoadFromDisk()方法源码。在获取SharedPreferences对象时。remove("XXXKey")方法。新的Runnable中(也就是新线程)在loadFromDisk()方法里。commit()提交容易造成ANR。建议使用apply()方法替换。commit()方法是同步的。getXXX() 导致ANR。读取完整个xml文件流内容后。apply()方法是异步的。

听海的博客 8483

Android偏好设置存储指南:使用SharedPreferences

接口是管理数据更新和删除操作的工具。开发者通过可以对数据进行增加、修改、删除,并将这些更改永久保存到存储介质中。它是对象的edit()方法返回的一个实例。要使用Editor对象,首先需要获取的实例:在上述代码中,我们通过方法获得了一个的实例,并通过调用它的edit()方法来获取一个Editor对象。参数是我们为这个文件指定的名字,而是操作模式,表示只有当前应用才能读写这个文件。

weixin_35364187的博客 664

SharedPreferences使用及原理

一、SharedPreferences介绍 SharedPreferences 类提供了一个通用框架,以便您能够保存和检索原始数据类型的永久性键值对。您可以使用 SharedPreferences 来保存任何原始数据:布尔值,浮点值,整型值,长整型和字符串。此数据将跨多个用户会话永久保留(即使您的应用已终止亦如此)。 SharedPreferences 使用 xml 格式为 Android 应用提供一种永久数据存贮方式,并且使用键值对的方式来存储数据的。相对于一个 Android 应用而言,目录 / dat

qq_40959750的博客 1万+

SharedPreferences的简单用法

使用步骤:1、得到SharedPreferences对象2、调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。3、向SharedPreferences.Editor对象中添加数据。4、调用commit方法将添加的数据提交。详细过程:1、得到SharedPreferences对象方法1: Context.getSharedPr

秦时明月 7万+

SharedPreferences用法

SharedPreferences用法 口述效果: EditText用于用户输入要存储的内容,点击第一个Button键存入。点击第二个按钮,TextView从该数据结构中取出被存入的内容。 直接贴代码: MainActivity.java: package com.example.savedatashared; import androidx.appcompat.app.AppCompatAc...

万事胜意 1097

SharedPreferences 用法详解

SharedPreferences 是Android平台给我们提供的一个轻量级的存储类,使用非常简单,能够轻松的存储数据和读取数据,特别适合用于保存软件配置参数。SharedPreferences只能保存简单类型的数据,例如:String、int等。一般会将复杂类型的数据转换成Base64编码,以字符串的形式保存。SharedPreferences背后是用xml文件存放数据,文件存放在/data/...

咻咻ing的专栏 1626

android SharedPreferences用法

 之前做应用时碰到这样一个问题:在“A” Activity 要与 “B” Activity的Fragment进行通信传值,但是忽然发现无法拿到B中Fragment的Handler,又不能发送广播,短暂的思考之后想到了SharedPreferences这个轻型的数据存储方式。   SharedPreferences的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信...

u011555996的博客 1949

SharedPreferences 用法总结

SharedPreferences 简介 当我们的应用想要保存用户的一些偏好参数,比如是否自动登录,是否记住账号密码,是否在WIFI下才能联网等相关信息时,可以采用SharedPreferences来保存数据。它的保存数据主要是简单的键值对(key-value),且保存的是一个XML文件。 SharedPreferences 常用方法 public abstract boolean co

贱贱的梦想 1837

SharedPreferences用法以及详解

用了很多次的SharedPreferences,这次来好好总结一下SharePreferences的用法以及需要了解的知识。主要是写给我第一位粉丝看的。希望以后的粉丝越来越多,我也更加有动力写更多更好的博客。 首先介绍一下SharedPreference。 SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity

MR_Condingson的博客 4万+

SharedPreferences用法以及简单理解

一.SharedPreferences的优缺点: 优点: 相对于文件存储来说比较方便,支持多种数据类型的存储。 缺点: 不安全,一般只用来存储配置信息 对数据的操作单一。 在存储上相同的key值存入的数据会被覆盖 二.SharedPreferences的使用方法 存储数据: SharedPreferences.Editor qq_xml=getSharedPreferences("qq_x...

L583701322的博客 9007

android中SharedPreferences用法

android中SharedPreferences用法详 2011-10-26 19:45:01      我来说两句         收藏  我要投稿 在android应用开发中,作为配置环境的preferences,用到的地方颇多,下面我带大家来详细讲解下android中SharedPreferences用法。先上图看下配置画面的效果吧。 上图是preferenc

#ifndefine maxwit #define maxwit...#endif 1124

android: SharedPreferences 用法详解

SharedPreferences 是Android平台给我们提供的一个轻量级的存储类,使用非常简单,能够轻松的存储数据和读取数据,特别适合用于保存软件配置参数。SharedPreferences只能保存简单类型的数据,例如:String、int等。一般会将复杂类型的数据转换成Base64编码,以字符串的形式保存。SharedPreferences背后是用xml文件存放数据,文件存放在/data/...

u011279649的专栏 2001

SharedPreferences用法

SharedPreferences 是Android数据持久化方法中最简单的一种实现。它的使用场景一般是在需要保存一个相对小的key-value集合。 SharedPreferences对象指向了一个保存key-value pairs(可以保存的基础数据类型:Boolean、int、Float、Long、String)的文件,并为读写他们提供了简单的方法。文件均由framework管理,其既可以

rr731961003的专栏 738

SharedPreferences用法

SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中重载窗口状态onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平台常规的Long长整形、Int整形、String字符串型的保存,它是什么样的处理方式呢?   SharedPreferences

linxuan0206的专栏 875

Android中SharedPreferences用法

1.SharedPreferences简介 为了保存软件的设置参数,Android 平台为我们提供了一个SharedPreferences 类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences 保存数据,其背后是用xml文件存放数据,文件存放在/data/data//shared_prefs 目录下。 2.获取SharedPreferences对象方

点滴的累积,不断的成长! 1164
上一篇: 异步加载网络图片带进度
下一篇: N个例子让你彻底理解java接口回调
你缺少想象力
博客等级 码龄11年 619粉丝 45原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值