称作配置系统未免太大了一点,不过它的配置管理这一块确实有加以设计,一方面以增加灵活性,另一方面以支持第三方扩展。通过分析源码,粗略画出如下的结构图:

  

  一、类分析

  SharedPreference

  一切的基础都是com.csipsimple_preferences.xml这个文件,它存在于app_packagename/shared_prefs文件夹下——它是SharedPerference类型对应的存储文件。里面存储了用户一些配置值,这些值有string、float、boolean、integer类型。

  PreferenceWrapper

  为了对这些值有一些比较通用的接口进行读取和修改,因此建了一个PreferenceWrapper类。PreferenceWrapper有四个HashMap,分别对应四种类型,每个HashMap中的key-value与SharedPreference中的key-value一一对应。

  除了基本操作key-value的函数,还包括一些工具函数,例如判断用户类型、设置编解码等。当然这些函数进一步还是对SharedPreference进行操作。不过我觉得还是另建一个类进行这些操作会好一些,让每个类的功能明确一点。

  PreferenceProvider

  PreferenceProvider继承自ContentProvider,是为了提供一个统一的增删改查接口。它指定了authorities为com.csipsimple.prefs,并将preferenceWrapper中的内容抽象为preference表。ContentProvider/ContentResolver是android提供的数据共享机制,可以用于跨进程数据共享,同时也作为一种数据交换标准。

  SipConfigManager

  调用ContentResolver的接口对数据增删改查。数据通过Uri来标识。

  PreferenceProviderWrapper

  就是这货让人很难理解。我一度以为PreferenceProviderWrapper是一个ContentProvider,其实本质来说,它却是一个ContentResolver,因为它调用SipConfigManager的函数,从而间接调用了ContentResolver的接口。它的作用也是为了方便数据的访问,从这点来说,和PreferenceWrapper没什么区别。

  二、总结

  通过上述分析,我们可以通过两个入口来访问配置选项,一个是PreferenceWrapper,另一个是PreferenceProviderWrapper。整个工程中,确实有些地方使用前者,有些地方使用后者,就这一点还是挺乱的。其实整套设计来说,就用PreferenceWrapper就好了。后者我们且认为是给第三方使用提供了一个示例吧。

CSipSimple配置系统的更多相关文章

  1. .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?

    配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个 ...

  2. .NET Core采用的全新配置系统[9]: 为什么针对XML的支持不够好?如何改进?

    物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...

  3. .NET Core采用的全新配置系统[1]: 读取配置数据

    提到“配置”二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置定义在这两个文 ...

  4. .NET Core采用的全新配置系统[2]: 配置模型设计详解

    在<.NET Core采用的全新配置系统[1]: 读取配置数据>中,我们通过实例的方式演示了几种典型的配置读取方式,其主要目的在于使读者朋友们从编程的角度对.NET Core的这个全新的配 ...

  5. .NET Core采用的全新配置系统[3]: “Options模式”下的配置是如何绑定为Options对象

    配置的原子结构就是单纯的键值对,并且键和值都是字符串,但是在真正的项目开发中我们一般不会单纯地以键值对的形式来使用配置.值得推荐的做法就是采用<.NET Core采用的全新配置系统[1]: 读取 ...

  6. .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]

    较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...

  7. C# 读取app.config配置文件 节点键值,提示 "配置系统未能初始化" 错误的解决方案

    新建C#项目,在app.config中添加了appSettings项,运行时出现"配置系统未能初始化"的错误,MSDN里写到,如果配置文件中包含 configSections 元素 ...

  8. App.config“配置系统未能初始化” 异常解决 C#

    System.Configuration.ConfigurationManager.AppSettings["user"]; 时出现“配置系统未能初始化” 错误 解决办法: 如果配 ...

  9. C# “配置系统未能初始化” 异常解决

    使用App.config配置参数,读取参数出现错误 “System.Configuration.ConfigurationErrorsException”类型的未经处理的异常在 System.Conf ...

随机推荐

  1. IO流-字节输出流OutputStream异常处理

    package it.cast_01; import java.io.FileNotFoundException; import java.io.FileOutputStream; import ja ...

  2. AngularJS小知识点一

    AngularJS是由谷歌公司及一个由开发者组成的个人社区共同打造.其主要优势在于帮助使用者在web应用程序中实现必要的动态视图.它是通过原生的MVC(模型-视图-控制器)功能来增强HTML. PS: ...

  3. 《C++ Primer》学习笔记【第三部分 类设计者的工具】

    第13章 拷贝控制 使用default:=defult只能修饰默认构造函数或拷贝控制成员,显式地要去编译器生成合成的版本. 使用delete:=delete通知编译器不希望定义这些成员,禁止试图使用它 ...

  4. 慕课网__css3__3D

  5. jmeter接口测试

    一.Jmeter简介 Jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,不像loadrunner那样体积大,是一个比较轻量级的测试工具,使用起来非常的简单 ...

  6. Redis入门学习笔记一

    Redis 简要描述: 1.  Redis 是啥 ? Redis 英文名称全称为: Remote Dictionary Server ,中译为远程字典服务器. 是一款区分于磁盘数据库如(Mysql)的 ...

  7. 即时聊天IM之三 XMPP协议客户端库的和Android端框架概述

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com smack ...

  8. 面试中常用的__proto__,prototype和原型链,你都了解了吗?

    上一篇随笔主要讲了变量提升的问题,今天我们来讲讲很多前端er在初期很长一段时间内都没有完全搞明白的原型链和构造函数. 1,什么是构造函数 那么要讲到构造函数,必须要有一个函数,所以我们建立一个函数 f ...

  9. onthink 数据库连接配置

    define('UC_DB_DSN', 'mysql://root:@127.0.0.1:3306/app'); // 数据库连接,使用Model方式调用API必须配置此项 /* 数据库配置 */ ' ...

  10. python 学习2

    在1的基础上 settings.py blog/models.py: 打开一个cmd, net start mysql ,启动mysql服务 mysql -uroot -p 再在py_fir目录下打开 ...