SharedPreference是Android提供的一种轻量级的数据存储方式,主要用来存储一些简单的配置信息,例如,默认欢迎语,登录用户名和密码等。其以键值对(key-value对)的方式存储,使得我们能很方便进行读取和存入。

1.读取Preferences数据:

SharedPreference接口主要负责读取应用程序的Preferences数据,它提供了如下常用的方法:

  • boolean contains(String key):判断SharedPreferences是否包含特定key的数据。
  • abstract Map< String,?> getAll() : 获取SharedPreferences数据里全部的key-value对。
  • boolean getXxx(String key,Xxx defValue):其中Xxx可以是boolean、float、int、long、String等各种基本类型的值。

2.写入Preferences数据:

SharedPreferences接口本身并没有提供写入数据的能力,而是通过SharedPreferences的内部接口,SharedPreferences调用edit()方法即可获取它所对应的Editor对象。Editor提供如下方法来向Preferences写入数据。

  • SharedPreferences.Editor clear():清空SharedPreferences里所有数据。
  • SharedPreferences.Editor putXxx(String key,xxx value):向SharedPreferences存入指定key对应的数据。
  • SharedPreferences.Editor remove(String key):删除SharedPreferences里指定的key对应的数据项。
  • boolean commit():当Editor编辑完成后,调用该方法提交修改。

从用法角度看,SharedPreferences和SharedPreferences.Editor组合起来非常像Map,其中SharedPreferences负责根据key读取数据,而SharedPreferences.Editor则用于写入数据。

SharedPreferences本身是一个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name,int mode)方法来获取SharedPreferences实例,该方法第一个参数为:保存键值对的文件名,第二个参数支持如下几个值。

  • Context.MODE_PRIVATE:指定SharedPreferences数据只能被本应用程序读写。
  • Context.MODE_WORLD_READABLE:指定SharedPreferences数据能被其他应用程序读,但不能写。
  • Context.MODE_WORLD_WRITEABLE:指定SharedPreferences数据能被其他应用程序读写。
    使用0或者MODE_PRIVATE作为默认的操作权限模式。

提示:从Android 4.2 开始,Android不在推荐使用Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE,因为这两种模式允许其他应用程序来读或写本应用创建的数据,因此容易导致安全漏洞。如果应用程序确实需要把内部数据暴露出来提供给其他应用访问,则应该使用ContentProvider.

下面是一个保存用户名和密码的例子,先看效果:

刚开始输入用户名和密码,点击保存密码,登录后关闭程序,让后在启动程序,则自动保存了用户名和密码。

代码如下:

activity_login.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".LoginActivity"><EditTextandroid:id="@+id/userName"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="UserName:"/><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:hint="PassWord:"android:id="@+id/passWord"android:password="true"/><CheckBoxandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Save Password"android:id="@+id/savePassWord"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Login"android:textAllCaps="false"android:id="@+id/login"android:layout_gravity="center"/>
</LinearLayout>

LoginActivity.java

public class LoginActivity extends AppCompatActivity {private EditText userName;private EditText passWord;private CheckBox savePassword;private Button loginBtn;private SharedPreferences preferences;private SharedPreferences.Editor editor;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);userName = (EditText) findViewById(R.id.userName);passWord = (EditText) findViewById(R.id.passWord);savePassword = (CheckBox) findViewById(R.id.savePassWord);loginBtn = (Button) findViewById(R.id.login);preferences = getSharedPreferences("UserInfo",MODE_PRIVATE);editor = preferences.edit();savePassword.setChecked(preferences.getBoolean("savePassword", false));if (savePassword.isChecked()){//读取数据userName.setText(preferences.getString("userName", null));passWord.setText(preferences.getString("passWord", null));}loginBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//写入数据editor.putString("userName",     userName.getText().toString());editor.putString("passWord", passWord.getText().toString());editor.putBoolean("savePassword", savePassword.isChecked());千万不要忘记commit。否则,如果文件存在,那么写入的内容不会保存。如果文件不存在,则不会创建文件。editor.commit();Intent intent = new Intent(LoginActivity.this,HomeActivity.class);startActivity(intent);}});}
}

点击登录按钮跳转到主界面的代码就不写了,主界面显示“Login Sucess”.

运行完上面程序,点击Android Studio的Android Device Monitor中的DDMS的 File Explorer面板,然后展开浏览树,如图:

发现SharedPreferences数据总是保存在/data/data/< package name>/shared_prefs目录下,因此SharedPreferences数据保存在内部存储器中,SharedPreferences数据总是以XML格式保存。通过File Explorer面板的导出文件按钮导出该XML文档,打开该XML文档卡伊看到如下文件内容:

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
-<map><boolean value="true" name="savePassword"/><string name="userName">Android</string><string name="passWord">123456</string>
</map>

几点说明:

SharedPreferences的获取有两种方法:

  • 一是上面提到的通过Activity自带(本质来讲是Context的)的getSharedPreferences方法,可以得到SharedPreferences对象。这种方法的好处是可以指定保存的xml文件名。

  • 另一种是通过PreferenceManager.getSharedPreferences(Context)获取SharedPreferences对象。这种方法不能指定保存的xml文件名,文件名使用默认的:+”_preferences.xml”的形式,不过如果在一个包里面采用这种方式需要保存多个这样的xml文件,可能会乱掉。建议采用第一种指定xml文件名的形式。

数据的存入必须通过SharedPreferences对象的编辑器对象Editor来实现,存入(put)之后与写入数据库类似一定要commit。

记录应用程序的使用次数Demo:

public class MainActivity extends Activity
{SharedPreferences preferences;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);preferences = getSharedPreferences("count", MODE_PRIVATE);// 读取SharedPreferences里的count数据int count = preferences.getInt("count", 0);// 显示程序以前使用的次数Toast.makeText(this, "程序以前被使用了" + count + "次。", Toast.LENGTH_LONG).show();SharedPreferences.Editor editor = preferences.edit();// 存入数据editor.putInt("count", ++count);// 提交修改editor.commit();}
}

为SharedPreferences添加监听器:

// 如果test.xml文件不存在,则会在editor.commit()时创建。// 如果没有调用commit()方法,写入的内容不会保存,而且不会创建文件。SharedPreferences prefs = getSharedPreferences("test", MODE_PRIVATE);SharedPreferences.Editor editor = prefs.edit();editor.putBoolean("bVal", true);editor.putString("sVal", "allei");editor.putFloat("fVal", 10.12f);editor.putInt("iVal", 1000);editor.putLong("lVal", 100l);editor.commit(); // 千万不要忘记commit。否则,如果文件存在,那么写入的内容不会保存。如果文件不存在,则不会创建文件。Log.i("xxxxxxxxxx", "bVal: " + prefs.getBoolean("bVal", false));Log.i("xxxxxxxxxx", "sVal: " + prefs.getString("sVal", ""));Log.i("xxxxxxxxxx", "fVal: " + prefs.getFloat("fVal", 0.0f));Log.i("xxxxxxxxxx", "iVal: " + prefs.getInt("iVal", 0));Log.i("xxxxxxxxxx", "lVal: " + prefs.getLong("lVal", 0l));prefs.registerOnSharedPreferenceChangeListener(myListener); // 注册editor = prefs.edit();editor.putString("sVal", "boss");editor.commit();  // 不要忘记commit。否则不会触发监听器。prefs.unregisterOnSharedPreferenceChangeListener(myListener);  // 解除注册,不会再相应改变editor = prefs.edit();editor.putString("sVal", "bosssss");editor.commit(); // 因为监听器已经解除注册,所以不会再触发监听器。

监听器定义:

private OnSharedPreferenceChangeListener myListener = new OnSharedPreferenceChangeListener() {@Overridepublic void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {Log.i("xxxxxxxx", "key: " + key + " = " + sharedPreferences.getString(key, "default"));}};

转载于:https://www.cnblogs.com/zhousysu/p/5483878.html

[Android] SharedPreference的使用相关推荐

  1. android preference tab,Android SharedPreference - TabHost问题

    我正在开发Android应用程序,它有两个不同的tabhost:Main和Child. 在主tabhost我有5个不同的标签,最后一个打开新的活动,我有登录页面.我想创建一个布尔类型isLoggedI ...

  2. Android SharedPreference最佳实践

    Android提供多种方式保存应用数据,其中一种方式是SharedPreferences,使用键值对保存私有基本的数据.所有的逻辑仅基于以下三个类: SharedPreferences SharedP ...

  3. Android sharedPreference设置缓存时间

    不废话,需求:缓存登录时的token,超过设置的存储时间就无效,怎么做? 使用ACache也可以设置缓存时间,但ACache在清缓存的时候会被清空.  SharedPreferences存储默认都是无 ...

  4. android sp缓存,Android sharedPreference设置缓存时间

    不废话,需求:缓存登录时的token,超过设置的存储时间就无效,怎么做? 使用ACache也可以设置缓存时间,但ACache在清缓存的时候会被清空. SharedPreferences存储默认都是无时 ...

  5. android sharedpreference 清空,Android 从SharedPreferences中存储,检索,删除和清除数据...

    示例 创建SharedPreferences BuyyaPref SharedPreferences pref = getApplicationContext().getSharedPreferenc ...

  6. Android — 使用 SharedPreferences 本地保存 key-value 数据

    如何获取 SharedPreferences 获取 SharedPreferences 有 2 种方式,第一种以名称为索引,第二种以 Activity 为索引. 1. getSharedPrefere ...

  7. Android应用开发-护眼提醒-总结篇

    设计初衷: 在学习<第一行代码>的服务那章时,涉及到了alarmmanager的内容.然后笔者当时正好在关注"程序员如何保护眼睛"的问题. 于是便自己做了一个demo, ...

  8. Kotlin 资源大全

    官网及文档 Kotlin 官网 Kotlin 文档 Kotlin 中文文档 Kotlin on GitHub 中文社区 掘金技术社区 教程 & 文章 视频教程 Kotlin 系列视频教程 开始 ...

  9. Android开发--详解SharedPreference/PreferenceActivity

    我们经常看到应用程序的设置页面,一般用到设置页面时,我们会继承自PreferenceActivity,它实现了SharedPreference,并生成相应的XML文件自动保存用户的设置,在设置页面中, ...

最新文章

  1. 深度学习开源库tiny-dnn的使用(MNIST)
  2. mysql 字符串有有乱码 转码_第09期:有关 MySQL 字符集的乱码问题
  3. Tungsten Fabric SDN — 软件架构
  4. linux内核丢弃udp报文,c++ Linux UDP数据包丢失的原因
  5. springboot+mybatis测试时遇到java.lang.NullPointerException
  6. oracle 表空间维护
  7. WCF项目的架构设计
  8. 深入浅出设计模式原则之依赖倒置原则
  9. uni-app 手指左右滑动实现翻页效果
  10. Java 实例 - 队列(Queue)用法
  11. 苦练IoT应用开发,还能加速变现,这个机会别错过
  12. 数据仓库之电商数仓-- 3.4、电商数据仓库系统(ADS层)
  13. Java的equals()和==的区别
  14. 密钥怎么存储在数据库中
  15. vue 引入自定义js方法并调用
  16. Android ImageView,使用Kotlin的ImageButton
  17. 跟我一起学Vim补全神级插件--YouCompleteMe
  18. 腾讯云技术布道师贺嘉正式受邀出席SDCC 2016微信开发专题,分享腾讯云的小程序解决方案...
  19. 后端面试(一)计算机网络相关
  20. 计算机内存和显卡,电脑显卡和内存怎么看

热门文章

  1. linux测试有效组,软件测试:三分钟掌握Linux命令之用户用户组命令(必读系列三)...
  2. 华为怎么申请鸿蒙商标,华为已注册华为鸿蒙商标是怎么回事 华为鸿蒙商标注册...
  3. mingus python_【Python图像特征的音乐序列生成】关于mingus一个bug的修复,兼改进情感模型...
  4. java遍历日期_Java遍历起止日期中间的所有日期操作
  5. 开机时自动运行shell_病毒究竟是怎么自动执行的(上)?
  6. 下列有关html文件结构的说法错误的是,计算机教师招聘考试_网络部分选择题+答案(12页)-原创力文档...
  7. 苹果笔记本能玩英雄联盟吗_《英雄联盟手游》日服安卓和ios数据互通说明 安卓和ios可以一起玩吗_英雄联盟手游...
  8. php openssl des ecb,php7.2 des-ede3-ecb加密报错:openssl_encrypt():Unknown cipher algorithm 落叶随风博客...
  9. 菜鸟教程php上传图片,PHP 文件上传
  10. android uri 电话号码,android 跳转通讯录 Android跳转到通讯录获取用户名称和手机号码的实现思路...