4.1 共享参数SharedPreferences
本节介绍Android的键值对存储方式—— 共享参数SharedPreferences的使用方法,包括如何保存数据与读取数据,通过共享参数结合“登录App”项目实现记住密码功能。
4.1.1 基本用法
SharedPreferences是Android的一个轻量级存储工具,采用的存储结构是Key-Value的键值对方式,类似于Java的Properties类,二者都是把Key-Value的键值对保存在配置文件中。不同的是Properties的文件内容是Key=Value这样的形式,而SharedPreferences的存储介质是符合XML规范的配置文件。保存SharedPreferences键值对信息的文件路径是/data/data/应用包名/shared_prefs/文件名.xml。下面是一个共享参数的XML文件示例:
<? xml version='1.0' encoding='utf-8' standalone='yes' ? > <map> <string name="name">Mr Lee</string> <int name="age" value="30" /> <boolean name="married" value="true" /> <float name="weight" value="100.0" /> </map>
基于XML格式的特点,SharedPreferences主要适用于如下场合:
(1)简单且孤立的数据。若是复杂且相互间有关的数据,则要保存在数据库中。
(2)文本形式的数据。若是二进制数据,则要保存在文件中。
(3)需要持久化存储的数据。在App退出后再次启动时,之前保存的数据仍然有效。
实际开发中,共享参数经常存储的数据有App的个性化配置信息、用户使用App的行为信息、临时需要保存的片段信息等。
SharedPreferences对数据的存储和读取操作类似于Map,也有put函数用于存储数据、get函数用于读取数据。在使用共享参数之前,要先调用getSharedPreferences函数声明文件名与操作模式,示例代码如下:
SharedPreferences sps= getSharedPreferences("share", Context.MODE_PRIVATE);
getSharedPreferences方法的第一个参数是文件名,上面的share表示当前使用的共享参数文件名是share.xml;第二个参数是操作模式,一般都填MODE_PRIVATE,表示私有模式。
共享参数存储数据要借助于Editor类,示例代码如下:
SharedPreferences.Editor editor = sps.edit(); editor.putString("name", "Mr Lee"); editor.putInt("age", 30); editor.putBoolean("married", true); editor.putFloat("weight", 100f); editor.commit();
共享参数读取数据相对简单,直接使用对象即可完成数据读取方法的调用,注意get方法的第二个参数表示默认值,示例代码如下:
String name = sps.getString("name", ""); int age = sps.getInt("age", 0); boolean married = sps.getBoolean("married", false); float weight = sps.getFloat("weight", 0);
下面通过页面录入信息演示SharedPreferences的存取过程,如图4-1所示。在页面上利用EditText录入用户注册信息,并保存到共享参数文件中。在另一个页面,App从共享参数文件中读取用户注册信息,并将注册信息依次显示在页面中,如图4-2所示。
图4-1 写入共享参数
图4-2 从共享参数读取
4.1.2 实现记住密码功能
上一章的实战项目“登录App”页面下方有一个“记住密码”复选框,当时只是为了演示控件的运用,并未真正记住密码。因为用户退出后重新进入登录页面,App没有回忆起上次用户的登录密码。现在我们利用共享参数对该项目进行改造,使之实现记住密码的功能。
改造的内容主要有3处:
(1)声明一个SharedPreferences对象,并在onCreate函数中调用getSharedPreferences方法对该对象进行初始化操作。
(2)登录成功时,如果用户勾选了“记住密码”,就使用共享参数保存手机号码与密码。在loginSuccess函数中增加如下代码:
if (bRemember) { SharedPreferences.Editor editor = mShared.edit(); editor.putString("phone", et_phone.getText().toString()); editor.putString("password", et_password.getText().toString()); editor.commit(); }
(3)在打开登录页面时,App从共享参数中读取手机号码与密码,并展示在界面上。在onCreate函数中增加如下代码:
String phone = mShared.getString("phone", ""); String password = mShared.getString("password", ""); et_phone.setText(phone); et_password.setText(password);
修改完毕后,如果不出意料,只要用户上次登录成功时勾选“记住密码”,下次进入登录页面时App就会自动填写上次登录的手机号码与密码。具体的效果如图4-3和图4-4所示。其中,图4-3所示为用户首次登录成功,此时勾选了“记住密码”;图4-4所示为用户再次进入登录页面,因为上次登录成功时已经记住密码,所以这次页面会自动展示保存的登录信息。
图4-3 将登录信息保存到共享参数
图4-4 从共享参数读取登录信息