Android应用Preference相关及源码浅析(SharePreferences篇)

在我们开发Android过程中数据的存储会有很多种解决方案,譬如常见的文件存储、数据库存储、网络云存储等,但是Android系统为咱们提供了更加方便的一种数据存储方式,那就是SharePreference数据存储。其实质也就是文件存储,只不过是符合XML标准的文件存储而已,而且其也是Android中比较常用的简易型数据存储解决方案。

我们在这里不仅要探讨SharePreference如何使用,还要探讨其源码是如何实现的;同时还要在下一篇博客讨论由SharePreference衍生出来的Preference相关Android组件实现,不过有意思的是我前几天在网上看见有人对google的Preference有很大争议,有人说他就是鸡肋,丑而不灵活自定义,有人说他是一个标准,很符合设计思想,至于谁说的有道理,我想看完本文和下一篇文章你自然会有自己的观点看法的,还有一点就是关于使用SharePreference耗时问题也是一个争议,分析完再说吧,那就现在开始分析吧(基于API 22源码)。

这里写图片描述

【工匠若水 http://blog.csdn.net/yanbober 转载请注明出处。点我开始Android技术交流

2 SharePreferences基本使用实例


在Android提供的几种数据存储方式中SharePreference属于轻量级的键值存储方式,以XML文件方式保存数据,通常用来存储一些用户行为开关状态等,也就是说SharePreference一般的存储类型都是一些常见的数据类型(PS:当然也可以存储一些复杂对象,不过需要曲线救国,下面会给出存储复杂对象的解决方案的)。

在我们平时应用开发时或多或少都会用到SharePreference,这里就先给出一个常见的使用实例,具体如下:

public class MainActivity extends ActionBarActivity {

private SharedPreferences mSharedPreferences;

private SharedPreferences mSharedPreferencesContext;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initTest();

}

private void initTest() {

mSharedPreferencesContext = getSharedPreferences(“Test”, MODE_PRIVATE);

mSharedPreferences = getPreferences(MODE_PRIVATE);

SharedPreferences.Editor editor = mSharedPreferencesContext.edit();

editor.putBoolean(“saveed”, true);

Set set = new HashSet<>();

set.add(“aaaaa”);

set.add(“bbbbbbbb”);

editor.putStringSet(“content”, set);

editor.commit();

SharedPreferences.Editor editorActivity = mSharedPreferences.edit();

editorActivity.putString(“name”, “haha”);

editorActivity.commit();

}

}

运行之后adb进入data应用包下的shared_prefs目录可以看见如下结果:

-rw-rw---- u0_a84 u0_a84 108 2015-08-23 10:34 MainActivity.xml

-rw-rw---- u0_a84 u0_a84 214 2015-08-23 10:34 Test.xml

其内容分别如下:

at Test.xml

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>

aaaaa

bbbbbbbb

at MainActivity.xml

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>

haha

可以看见SharePreference的使用还是非常简单easy的,所以不做太多的使用说明,我们接下来重点依然是关注其实现原理。

【工匠若水 http://blog.csdn.net/yanbober 转载请注明出处。点我开始Android技术交流

3 SharePreferences源码分析


3-1 从SharePreferences接口说起

其实讲句实话,SharePreference的源码没啥深奥的东东,其实质和ACache类似,都算时比较独立的东东。分析之前我们还是先来看下SharePreference这个类的源码,具体如下:

//你会发现SharedPreferences其实是一个接口而已

public interface SharedPreferences {

//定义一个用于在数据发生改变时调用的监听回调

public interface OnSharedPreferenceChangeListener {

//哪个key对应的值发生变化

void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key);

}

//编辑SharedPreferences对象设定值的接口

public interface Editor {

//一些编辑存储基本数据key-value的接口方法

Editor putString(String key, String value);

Editor putStringSet(String key, Set values);

Editor putInt(String key, int value);

Editor putLong(String key, long value);

Editor putFloat(String key, float value);

Editor putBoolean(String key, boolean value);

//删除指定key的键值对

Editor remove(String key);

//清空所有键值对

Editor clear();

//同步的提交到硬件磁盘

boolean commit();

//将修改数据原子提交到内存,而后异步提交到硬件磁盘

void apply();

}

//获取指定数据

Map<String, ?> getAll();

String getString(String key, String defValue);

Set getStringSet(String key, Set defValues);

int getInt(String key, int defValue);

long getLong(String key, long defValue);

float getFloat(String key, float defValue);

boolean getBoolean(String key, boolean defValue);

boolean contains(String key);

//针对preferences创建一个新的Editor对象,通过它你可以修改preferences里的数据,并且原子化的将这些数据提交回SharedPreferences对象

Editor edit();

//注册一个回调函数,当一个preference发生变化时调用

void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener);

//注销一个之前(注册)的回调函数

void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener);

}

很明显的可以看见,SharePreference源码其实是很简单的。既然这里说了SharePreference类只是一个接口,那么他一定有自己的实现类的,怎么办呢?我们继续往下看。

3-2 SharePreferences实现类SharePreferencesImpl分析

我们从上面SharePreference的使用入

  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PreferenceAndroid 中的一种轻量级的持久化存储机制,可以用来存储应用程序的各种设置和配置信息。在使用 Preference 时,可以通过简单的键值对来存储和读取数据,同时这些数据在应用程序退出后仍然可以保持不变,即实现了数据的持久化存储。 Preference 可以通过 XML 文件来定义,通常包括 PreferenceScreen、PreferenceCategory、CheckBoxPreference、EditTextPreference、ListPreference 等几种类型。其中,PreferenceScreen 是一个根元素,用来包含所有的 Preference,PreferenceCategory 用来将 Preference 分组,CheckBoxPreference 表示复选框,EditTextPreference 表示文本输入框,ListPreference 表示下拉列表框等。 使用 Preference 的步骤通常如下: 1. 定义一个 XML 文件,用来描述 Preference 的结构和属性; 2. 在 Activity 中通过 PreferenceFragment 或 PreferenceActivity 加载该 XML 文件; 3. 在代码中通过 SharedPreferences 对象来获取和设置 Preference 中的键值对。 例如,以下是一个简单的 Preference XML 文件: ```xml <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="Display settings"> <CheckBoxPreference android:key="show_images" android:title="Show images" android:summary="Whether to show images in the app" android:defaultValue="true" /> <ListPreference android:key="font_size" android:title="Font size" android:summary="Select the font size" android:entries="@array/font_sizes" android:entryValues="@array/font_sizes_values" android:defaultValue="16sp" /> </PreferenceCategory> <PreferenceCategory android:title="User settings"> <EditTextPreference android:key="username" android:title="Username" android:summary="Enter your username" android:dialogTitle="Enter your username" /> </PreferenceCategory> </PreferenceScreen> ``` 在 Activity 中加载该 XML 文件的方法如下: ```java public class SettingsActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); } } ``` 在代码中获取和设置 Preference 的方法如下: ```java SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); boolean showImages = preferences.getBoolean("show_images", true); String fontSize = preferences.getString("font_size", "16sp"); String username = preferences.getString("username", ""); ``` 其中,PreferenceManager.getDefaultSharedPreferences() 方法可以获取一个默认的 SharedPreferences 对象,通过该对象可以获取和设置 Preference 中的键值对。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值