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">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
更多相关文章
- Android请求网络有三种方式:HttpURLConnection、 HttpClient和OkH
- Android动态加载――加载已安装APK中的类
- Android(安卓)7+的一些报错
- Android(安卓)截取屏幕图片并保存
- 申请Android(安卓)Map 的API Key(v2)的最新申请方式(SHA1密钥)
- context对于android的重要意义
- 获取android手机内部存储空间和外…
- Android三种播放视频的方式
- 再谈 android 设备SN的获取 续 android 设备唯一码的获取,Cpu号,Ma