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配置系统,布布扣,bubuko.com

时间: 2024-10-10 15:19:45

CSipSimple配置系统的相关文章

Lichee (五) sysconfig1.fex 配置系统

sysconfig配置系统,作为一个通用的软件平台,还希望通过它,可以适应用户不同的方案.通过给出一个对应的配置,用户的方案就可以自动运行,而不需要修改系统里面的代码,或者重新给出参数. 一. sysconfig1.fex简述 配置脚本的本意是给系统传递参数.作为一个稳定的系统,本身应该和方案无关, 不管不同方案的差别有多大,系统都不应该重新编译才能运行.这里所说的系统,不单单指操作系统,也包括其中的驱动,模块,等等. 不同方案的差别,通常体现在: 1) 使用的硬件模块不同,比如使用了不同的NA

配置系统引导启动SuperScoekt

SuperSocket源码解析之启动过程 一 简介 这里主要说明从配置系统引导启动SuperScoekt作为应用程序,且以控制台程序方式启动 二 启动过程 2.1 配置解析 从读取配置文件开始,直接拿到一个SocketServiceConfig对象,这个类型封装了SuperSocket的所有配置,其主要包含了一下参数 1)服务器根配置 配置节点 "superSocket" SuperSocket 配置的根节点,它定义了 SuperSocket 所需要的全局参数. 让我们先看下根节点的所

配置系统未能初始化 错误的解决方案

今天修改了App.config,结果运行的时候出现了 "配置系统未能初始化" 的错误.找了半天才发现是下面的原因造成的: MSDN里写到"如果配置文件中包含 configSections 元素,则 configSections 元素必须是 configuration 元素的第一个子元素.". 配置系统未能初始化 错误的解决方案,布布扣,bubuko.com

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

配置的原子结构就是单纯的键值对,并且键和值都是字符串,但是在真正的项目开发中我们一般不会单纯地以键值对的形式来使用配置.值得推荐的做法就是采用<.NET Core采用的全新配置系统[1]: 读取配置数据>最后演示的方式将相关的配置定义成一个Options类型,并采用与类型定义想匹配的结构来定义原始的配置,这样就能利用它们之间的映射关系将读取的配置数据绑定为Options对象,我们将这种编程模式称为“Options模式”. [ 本文已经同步到<ASP.NET Core框架揭秘>之中]

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

在<.NET Core采用的全新配置系统[1]: 读取配置数据>中,我们通过实例的方式演示了几种典型的配置读取方式,其主要目的在于使读者朋友们从编程的角度对.NET Core的这个全新的配置系统具有一个大体上的认识,接下来我们从设计的维度来重写认识它.通过上面演示的实例我们知道,配置的编程模型涉及到三个核心对象,它们分别是Configuration.ConfigurationSource和ConfigurationBuilder.如果从设计层面来审视这个配置系统,还缺少另一个名为Configu

关于 App.config文件出错,配置系统未能初始化。 问题解决方案

如果配置文件中包含 configSections 元素,则 configSections 元素必须是 configuration 元素的第一个子元素.将appSettings放到configSections 后,则正常. configSections中的元素必须和下面的自定义配置节一一对应. 例如 下面有4个自定义配置节,但是在configSections只有3个,就会出错:配置系统未能初始化. <configSections>   <section name="A_F63_S

读取配置文件异常,配置系统未能初始化

异常原因:配置文件内容的顺序有一定要求 configSections-->connectionStrings-->appSettings <?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="WebConfigSection" type="MediaActionSe

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

物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigurationSource和IniConfigurationSource.但是对于.NET Core的配置系统来说,我们习以为常的XML反倒不是理想的配置源,至少和JSON比较起来,它具有一个先天不足的劣势,那就是针对集合数据结构的支持不如人意.[ 本文已经同步到<ASP.NET Core框架揭秘>之中

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

配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个名为ConfigurationReloadToken的类型开始. [ 本文已经同步到<ASP.NET Core框架揭秘>之中] 目录一.从ConfigurationReloadToken说起二.Configuration对象与配置文件的同步三.应用重新加载的配置四.同步流程总结 一.从Config