CSipSimple配置系统
称作配置系统未免太大了一点,不过它的配置管理这一块确实有加以设计,一方面以增加灵活性,另一方面以支持第三方扩展。通过分析源码,粗略画出如下的结构图:
一、类分析
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配置系统的更多相关文章
- .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?
配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个 ...
- .NET Core采用的全新配置系统[9]: 为什么针对XML的支持不够好?如何改进?
物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...
- .NET Core采用的全新配置系统[1]: 读取配置数据
提到“配置”二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置定义在这两个文 ...
- .NET Core采用的全新配置系统[2]: 配置模型设计详解
在<.NET Core采用的全新配置系统[1]: 读取配置数据>中,我们通过实例的方式演示了几种典型的配置读取方式,其主要目的在于使读者朋友们从编程的角度对.NET Core的这个全新的配 ...
- .NET Core采用的全新配置系统[3]: “Options模式”下的配置是如何绑定为Options对象
配置的原子结构就是单纯的键值对,并且键和值都是字符串,但是在真正的项目开发中我们一般不会单纯地以键值对的形式来使用配置.值得推荐的做法就是采用<.NET Core采用的全新配置系统[1]: 读取 ...
- .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]
较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...
- C# 读取app.config配置文件 节点键值,提示 "配置系统未能初始化" 错误的解决方案
新建C#项目,在app.config中添加了appSettings项,运行时出现"配置系统未能初始化"的错误,MSDN里写到,如果配置文件中包含 configSections 元素 ...
- App.config“配置系统未能初始化” 异常解决 C#
System.Configuration.ConfigurationManager.AppSettings["user"]; 时出现“配置系统未能初始化” 错误 解决办法: 如果配 ...
- C# “配置系统未能初始化” 异常解决
使用App.config配置参数,读取参数出现错误 “System.Configuration.ConfigurationErrorsException”类型的未经处理的异常在 System.Conf ...
随机推荐
- (转)awk实例练习(二)
文章转自 http://www.cnblogs.com/zhuyp1015/archive/2012/07/14/2591842.html 先来总结一下awk内置变量: ARGC 命 ...
- 事件委托和JQ事件绑定总结
事件委托: 比喻:事件委托的事例在现实当中比比皆是.比如,有三个同事预计会在周一收到快递.为签收快递,有两种办法:一是三个人在公司门口等快递:二是委托给前台MM代为签收.现实当中,我们大都采用委托的方 ...
- 【转载】 input 输入格式化
不多说直接 发链接 http://nosir.github.io/cleave.js/
- validate插件深入学习-02 常用方法和validate对象的方法
①检查表单元素是否有效 valid() 在表单内添加<button id="check">检查</button> $('#check').click(fun ...
- Nodejs的安装及配置
1.从Nodejs官网下载安装包,进行安装,是否安装成功,可以从cmd npm去检查,出现如下界面,就表示安装成功 2.打开Webstorm进行配置,(如果安装前打开webstorm了,需要重启web ...
- YYCache设计思路及源码学习
设计思路 利用YYCache来进行操作,实质操作分为了内存缓存操作(YYMemoryCache)和硬盘缓存操作(YYDiskCache).内存缓存设计一般是在内存中开辟一个空间用以保存请求的数据(一般 ...
- mybatis入门_配置文件的配置
一.全局配置文件配置 1.1 properties标签 Properties标签可以用来加载配置文件.例如,我们可以将数据库的连接信息放入到一个配置文件(db.properties中..) 下为db. ...
- iOS 工程功能实现之好用的第三方
1.http://www.cocoachina.com/ios/20140224/7868.html (一个天气App案例) LBBlurredImage是一个继承自UIImageView,轻而易举 ...
- JQ_浏览器窗口改变触发
$(window).resize(function () { //当浏览器大小变化时 alert($(window).height()); //浏览器时下窗口可视区域高度 alert($(docume ...
- JOIN关联表中ON,WHERE后面跟条件的区别
select * from td left join (select case_id as sup_case_id , count(*) supervise_number from td_kcdc ...