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

  • SharedPreferences
  • SharedPreferences.Editor
  • SharedPreferences.OnSharedPreferenceChangeListener

SharedPreference

SharedPreference在这三个类是最重要的,负责获取(解析)存储数据。提供获取对象的编辑接口,在OnSharedPreferenceChangeListener中提供增加移出对象的接口。

  • 创建SharedPreference对象,需要上下文对象(可以是应用程序的上下文)。
  • getSharedPreferences 方法解析配置文件并创建相关的对象映射。
  • 通过上下文有多种创建它,强烈建议使用MODE_PRIVATE。因为创建一个可读写的文件是非常危险的,容易在应用中产生安全漏洞。
// parse Preference file
SharedPreferences preferences = context.getSharedPreferences("<span class="skimlinks-unlinked">com.example.app", Context.MODE_PRIVATE);// get values from Map
preferences.getBoolean("key", defaultValue)
preferences.get..("key", defaultValue)// you can get all Map but be careful you must not modify the collection returned by this
// method, or alter any of its contents.
Map<String, ?> all = preferences.getAll();// get Editor object
SharedPreferences.Editor editor = preferences.edit();//add on Change Listener
preferences.registerOnSharedPreferenceChangeListener(mListener);//remove on Change Listener
preferences.unregisterOnSharedPreferenceChangeListener(mListener);// listener example
SharedPreferences.OnSharedPreferenceChangeListener mOnSharedPreferenceChangeListener=newSharedPreferences.OnSharedPreferenceChangeListener() {@OverridepublicvoidonSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {}
};

Editor

SharedPreferences.Editor是用来修改SharedPreferences对象值的接口。你在editor 做出的修改都是待处理的,并没有被复制到SharedPreferences里,直到你调用commit()或apply()修改才会被执行。

  • 使用简单的接口在Editor放入值。
  • 同步保存数据使用commit() 方法或者异步保存数据使用apply()方法会更快点。实际上不同的线程使用commit()会更快点,这是我喜欢使用commit()方法的原因。
  • 移出数据使用remove()方法,清除所有数据使用clear()方法。
// get Editor object
SharedPreferences.Editor editor = preferences.edit();// put values in editor
editor.putBoolean("key", value);
editor.put..("key", value);// remove single value by key
editor.remove("key");// remove all values
editor.clear();// commit your putted values to the SharedPreferences object synchronously
// returns true if success
booleanresult = editor.commit();// do the same as commit() but asynchronously (faster but not safely)
// returns nothing
editor.apply();

性能和注意事项

SharedPreferences是单例对象,你可以很容易获取你想要的引用。只在你第一次调用getSharedPreferences方法时打开文件时,创建一个实例对象。

// There are 1000 String values in preferences
SharedPreferences first = context.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);
// call time = 4 milliseconds

SharedPreferences second = context.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);
// call time = 0 milliseconds

SharedPreferences third = context.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);
// call time = 0 milliseconds

SharedPreferences 是单例对象,你可以改变它的实例,不用担心同一个对象数据会不同。

first.edit().putInt(”key”,15).commit();
intfirstValue = first.getInt(”key”,0));
// firstValue is 15
intsecondValue = second.getInt(”key”,0));
// secondValue is also 15

当你第一次调用get方法时,它解析对象并把放入map中,第二次获取数据从map 中获取,不需再解析。

first.getString(”key”,null)
// call time = 147 milliseconds

first.getString(”key”,null)
// call time = 0 milliseconds

second.getString(”key”,null)
// call time = 0 milliseconds

third.getString(”key”,null)
// call time = 0 milliseconds

记住Preference的数据越大,get、commit、apply、remove和clear方法耗时越长。所以强烈建议把存储的数据分成小的对象。

当你的应用更新以后,你的Preferences不会被移除。所以有些情况下需要创建迁移数据的方案。比如,在应用启动的时候,你的应用解析本地JSON数据,实现这个你需要做的仅仅是存储标志数据(该数据是否为本地数据)。一段时间后,你更新JSON数据发布新的版本,用户会更新应用程序但是不会下载新的JSON数据,因为已经在本地存储了。

publicclassMigrationManager {privatefinalstaticString KEY_PREFERENCES_VERSION ="key_preferences_version";privatefinalstaticintPREFERENCES_VERSION =2;publicstaticvoidmigrate(Context context) {SharedPreferences preferences = context.getSharedPreferences("pref", Context.MODE_PRIVATE);checkPreferences(preferences);}privatestaticvoidcheckPreferences(SharedPreferences thePreferences) {finaldoubleoldVersion = thePreferences.getInt(KEY_PREFERENCES_VERSION,1);if(oldVersion < PREFERENCES_VERSION) {finalSharedPreferences.Editor edit = <spanclass="skimlinks-unlinked">thePreferences.edit</span>();<spanclass="skimlinks-unlinked">edit.clear</span>();edit.putInt(KEY_PREFERENCES_VERSION, currentVersion);edit.commit();}}
}

SharedPreferences 数据存储在app文件夹下的xml文件下。

// yours preferences
/data/data/YOUR_PACKAGE_NAME/shared_prefs/YOUR_PREFS_NAME.xml// default preferences
/data/data/YOUR_PACKAGE_NAME/shared_prefs/YOUR_PACKAGE_NAME_preferences.xml

示例代码

publicclassPreferencesManager {privatestaticfinalString PREF_NAME ="<span class="skimlinks-unlinked">com.example.app.PREF_NAME";privatestaticfinalString KEY_VALUE ="<span class="skimlinks-unlinked">com.example.app.KEY_VALUE";privatestaticPreferencesManager sInstance;privatefinalSharedPreferences mPref;privatePreferencesManager(Context context) {mPref = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);}publicstaticsynchronizedvoidinitializeInstance(Context context) {if(sInstance ==null) {sInstance =newPreferencesManager(context);}}publicstaticsynchronizedPreferencesManager getInstance() {if(sInstance ==null) {thrownewIllegalStateException(PreferencesManager.class.getSimpleName() +" is not initialized, call initializeInstance(..) method first.");}returnsInstance;}publicvoidsetValue(longvalue) {mPref.edit().putLong(KEY_VALUE, value).commit();}publiclonggetValue() {returnmPref.getLong(KEY_VALUE,0);}publicvoidremove(String key) {mPref.edit().remove(key).commit();}publicbooleanclear() {returnmPref.edit().clear().commit();}
}

本文代码可以在github上找到。

转载于:https://www.cnblogs.com/zhujiabin/p/5286347.html

Android SharedPreference最佳实践相关推荐

  1. Android开发最佳实践《IT蓝豹》

    Android开发最佳实践   移动开发Android经验分享应用GoogleMaterial Design 摘要:前 段时间,Google公布了Android开发最佳实践的一系列课程,涉及到一些平时 ...

  2. android 首页接口设计方案,Android开发最佳实践——1.接口设计

    Android开发最佳实践--1.接口设计 一个项目刚开始的时候,最需要确认的就是接口设计了:数据如何传递,使用什么格式什么协议乃至如何保证安全性.如果一个项目的接口设计不合理--比如没有考虑到安全性 ...

  3. [教程] Android PHP 最佳实践视频教程

    这几个月实在太忙了,一直没有时间关顾博客,不过好在日前花费了不少心血的视频教程<Android+PHP最佳实践>已经在华章教育和China-Pub上线了,在这里给大家简短的推荐一下吧:本系 ...

  4. Android开发最佳实践

    原文链接:https://github.com/futurice/android-best-practices 转载来源:http://blog.csdn.net/asce1885/article/d ...

  5. Android开发最佳实践---Futurice之见

    原文链接:https://github.com/futurice/android-best-practices 本文是Futurice公司的Android开发人员总结的最佳实践,遵循这些准则可以避免重 ...

  6. Android UI最佳实践

    为多屏设计(一) - 支持多个屏幕尺寸 参考地址:http://developer.android.com/training/multiscreen/index.html  Android UI设计提 ...

  7. 安卓软件开发需要学什么软件?Android开发最佳实践手册全网独一份,面试必问

    缘起 经过近十年的发展,Android技术优化日新月异,如今Android 10.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS.到了各大厂商手里,改源码.自定义系统, ...

  8. 膜拜大牛!Android开发最佳实践手册全网独一份,终获offer

    前言 首先介绍一下自己,计算机水本,考研与我无缘.之前在帝都某公司算法部实习,公司算大公司吧,然而个人爱好偏开发,大二的时候写个一个app,主要是用各种框架. 学习路径:如何循序渐进.阶段性的学习An ...

  9. Android SharedPreferences最佳实践

    Android开发中,我们经常会用到SharedPreferences,它是一种轻量的数据存储方式,通常用来存储一些简单的配置信息.看了网络上的一些文章,感觉都不是特别满意,因此希望能结合自己的经验和 ...

最新文章

  1. 使用sqlite3解决IDEA中SVN更新提示cleanup却无法cleanup的问题
  2. Idea 2018.2.5创建springboot项目依赖包没有的错误
  3. VTK:简单操作之RandomSequence
  4. 解决Ubuntu Pycharm无法输入中文
  5. 最优化作业02—一维最优化方法
  6. 外部访问docker容器(docker run -p/-P 指令) docker run -d -p 5000:5000 {hostPort:containerPort(映射所有接口地}
  7. DotnetCharting控件的破解方法
  8. MM看过来!教你如何打扮变成时尚达人 - 生活至上,美容至尚!
  9. linux中group命令详解,linux groupmod命令参数及用法详解
  10. 深度技术win11 64位正版系统v2021.07
  11. python list 实现原理,Python 列表(List)的底层实现原理分析
  12. 文件/目录权限设置命令:chmod
  13. JavaScript之节点的创建、替换、删除、插入
  14. Entity Framework 无法加载指定的元数据资源。
  15. VM 14 CentOS 7.0虚拟机上网设置方法
  16. HiTool烧写Hi3536操作记录
  17. 网易云音乐灰色歌曲在线听的方法
  18. 如何画出一张合格的技术架构图?
  19. HTML5小游戏--数字炸弹
  20. 【小月电子】XILINX FPGA开发板(XLOGIC_V1)系统学习教程-LESSON9简易测试系统

热门文章

  1. 20多年前我住的平房
  2. 酒糟怎么处理才能喂母羊?
  3. 今天有个微信好友咨询我
  4. 如何找到解决问题的方法?
  5. 互联网赚钱,必须聚焦这三件事
  6. linux-2.6.
  7. android 返回键退出程序了吗?
  8. sql stuff 函数_SQL STUFF函数概述
  9. sql示例_PARSEONLY SQL命令概述和示例
  10. CListCtrl 使用技巧 1