说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

从友盟微社区看Android第三方SDK架构实践

HTML文档下载 WORD文档下载 PDF文档下载
第三方SDK的开发需要考虑很多因素,比如稳定性、灵活性等,并且还要做到能让开发者能自由定制UI层、替换子系统。本文以友盟微社区为例,详细讲解了在开发SDK时架构方面的设计理念。

开发Android第三方SDK说难不难,但说简单也不简单,要开发一个给很多人使用的第三方SDK,如何在保证稳定性的同时,增强SDK的灵活性,让开发者能自由定制UI层、替换子系统,这是一个值得思考的问题。为了解决这个问题,开发第三方SDK必须要有良好的应用架构。本文就分享一下我在开发友盟微社区SDK时在架构方面的一些想法。

友盟的微社区是一款帮助开发者在应用中快速搭建一个社区(类似于新浪微博、朋友圈),目前正在内测当中。

技术架构

从项目结构上来说,友盟微社区SDK可以简单分为如下三层。

  • UI层(开源)。UI层对外开放,目的是让用户能够定制微社区的UI效果,使微社区SDK能够很自然的融入到用户的App中。
  • 业务逻辑层。业务逻辑层会通过一个统一的接口向UI层提供数据请求等功能,比如获取缓存的feed、好友列表等,因此业务逻辑层对于用户来说是一个数据操作接口,通过这个接口用户能够与SDK核心层进行一些数据方面的操作。
  • 核心层。核心层则包含了友盟SDK的核心系统抽象,比如账户系统、推送、数据库、网络操作等,这一层对外封闭,用户可以通过一些接口与核心层进行交互。而核心层定义的抽象使得用户可以很方便的实现定制化,即自己实现抽象接口,然后将具体的实现注入到微社区中,从而使自己的子系统替换掉微社区中的默认实现。

如图1所示,SDK层次非常分明,通过这三个层次的隔离,使得用户既可以自定义最外层的UI效果,也对外隐藏了业务逻辑层、核心层的实现细节。而核心层定义的子系统抽象,使得用户可以注入自己的实现,保证了整个微社区SDK的灵活性、扩展性。

图1 洋葱结构图


简单来说,就是用户在UI层通过逻辑层暴露的通用接口来操作SDK,从封闭的核心系统中获取、存储数据以及其他的相关操作。层次结构如图2所示。

图2 层次结构图

图1、图2都显示了SDK是通过不同的层次来分离职责,是一个较为典型的架构形式。对于用户来说,最关心的莫过于可定制化。UI层开放源码,自然可以通过修改代码来实现。其他的定制化用户就需要依赖注入来实现。微社区SDK内部依赖于抽象,而不依赖于具体实现,并且用户可以注入具体实现。也就是说用户可以根据我们的抽象接口实现自己的子系统,然后注入到SDK内部,SDK此时就会使用用户注入的实现,这样就达到了子系统替换的效果,也就是我们说的定制化。

友盟微社区的定制化

如何满足定制化?

那么如何来实现定制化呢?友盟微社区SDK内部定义了一些抽象,比如Loginable、Pushable、ImageLoader来分别代表登录系统接口、推送接口、图片加载接口,每种接口都有一个SDKManager来进行管理。比如管理登录子系统的就是LoginSDKManager,用户可以往这个Manager里面添加、移除具体的登录系统实现,然后通过useThis函数来指定使用某个具体的实现(SDK Manager里面可能有多个实现)。结构图如图3所示。


图3  LoginSDKManager功能

SDK Manager是一个泛型类,类型T就代表了接口类型,比如上述的Loginable等。通过泛型我们就可以将这些通用的添加、移除实现等操作抽象化,避免重复代码。代码如下所示:

public abstract class SDKManager<T> {

  //泛型Map

 private Map<String, T> mImplMap = new HashMap<String, T>();

 // 要使用的实现的key

 private String mCurrentKey = "";

 public void addImpl(String key, T impl) {

 mImplMap.put(mCurrentKey, impl);

  }

 public void removeImpl(String key) {

 mImplMap.remove(mCurrentKey);

  }

 public void useThis(String key) {

 mCurrentKey = key;

  }

 public T getCurrentImpl() {

 return mImplMap.get(mCurrentKey);

  }

}

代码很简单,就是在SDK Manager内部维护了一个Map,key是用户为这个实现指定的一个字符串值,value就是具体的实现。用户可以通过这个key来移除实现,更常用的是我们需要调用useThis(String key)接口来指定使用某个具体的实现。 

我们并没有直接使用SDKManager,因为它是一个抽象泛型类,因此我们定义了一些子类来对不同的实现进行管理,这些子类都是单例类,例如LoginSDKManager,代码如下所示。

public final class LoginSDKManager extendsSDKManager<Loginable> {

 // 单例对象

 static LoginSDKManager sInstance = new LoginSDKManager();

 private LoginSDKManager() {

  }

 // 获取单例对象

 public static LoginSDKManager getInstance() {

 return sInstance;

  }

}

在用户需要对登录系统进行管理时,通过LoginSDKManager.getInstance()就可以获取到负责管理登录系统的SDKManager,此时用户可以通过addImpl(String key, T impl)、useThis(String key)等接口对登录系统进行管理,这就可以灵活使用用户自定义的子系统。

示例

下面还是以一个示例来说明问题吧。在与用户沟通的过程中,我们发现登录模块是用户自定义概率最高的子系统。通常情况下,用户可能有自己的账户系统或者使用了第三方登录,此时用户就不需要友盟微社区SDK中附带的登录实现,完全依赖自己的账户系统或者其他第三方登录SDK来实现一个登录系统。下面我们就以实现登录系统(其他子系统的自定义原理一样)来演示自定义过程。在开始之前,我们需要对登录的抽象接口Loginable进行了解。代码如下所示:

public interface Loginable {

 public void login();

 public void logout();

 public boolean isLogined();

}

  • login():登录函数,用户需要在登录成功后将用户信息回调给友盟微社区SDK(具体过程可以参考友微社区集成文档http://dev.umeng.com/wsq/android/detail-integration#1);
  • logout():登出函数,注销用户的登录即可;
  • isLogined():用户是否登录,返回true表示已登录,否则为未登录。

微社区SDK内部通过抽象了几个简单接口来定义登录模块的功能,用户通过实现这几个函数即可定制自己的登录系统,最后将实现注入到SDK即可。例如,如果你的应用中已经有了自己的账户系统逻辑,你可以在Loginable的几个函数中通过调用你的账户系统逻辑实现这几个功能;如果你使用了友盟社会化组件那么你可以通过该社会化组件的登录、登出功能实现对应的功能,例如你可以在login()函数中调用UMSocialService对象的doOauthVerify(Context context、SHARE_MEDIA platform、UMAuthListenerlistener)接口来实现登录。

一句话概括就是:自定义一个实现了Loginable接口的类,在这个类的各个函数中调用你原有的登录、登出、判断是否已登录的函数来实现对应的功能。实现了登录类之后,通过LoginSDKManager的addImpl(String key, Loginable impl)来将该实现注入到SDK中,最后通过LoginSDKManager的useThis(String key)函数来指定要使用的登录实现,这个key就是addImpl(String key、Loginable impl)中设置的key。

自定义登录类示例代码如下:

/**

* 友盟社会化组件的登录实现,这里可以替换成自己的账户系统、第三方登录等,实现几个接口函数即可。

*/

public class SocialLoginImpl implementsLoginable {

 @Override

  public void login() {

 // 登录的具体实现,可以调用你自己的登录代码或者第三方SDK的登录函数

  }

 @Override

 public void logout() {

 // 登出的具体实现,可以调用你自己的登录代码或者第三方SDK的登录函数

  }

 @Override

 public boolean isLogined() {

 // 检测是否登录

 return true /* 代码省略 */;

  }

}

**注入登录实现 :** 

// 登录系统管理器

LoginSDKManager loginMgr =LoginSDKManager.getInstance() ;

// key

String clzKey =SocialLoginImpl.class.getName() ;

// 注入实现

loginMgr.addImpl(clzKey, newSocialLoginImpl());

// 指定使用的具体实现

loginMgr.useThis(clzKey);

为了更简单,这个过程被我们封装到一个函数中,使用的代码最后简化为 : 

// 一行代码搞定!这个函数封装了上述所有的代码。

LoginSDKManager.getInstance().addAndUse(newSocialLoginImpl()) ;

通过这几步,登录系统就被替换掉了。当微社区需要登录时,微社区SDK就会通过LoginSDKManager获取当前使用的登录实现,然后触发login()函数,此时就会执行你的登录代码了。登录成功之后,通过login()函数的回调listener(这个简单示例中没有给出该listener,具体可参考友盟微社区使用已有账户系统)将用户信息传回给友盟SDK,就完成了整个登录过程。

目前友盟微社区SDK还处在内测阶段(内测申请地址:http://wsq.umeng.com/),不过已经可以投入使用。已经有一部分集成了友盟微社区的App上线,并且运行良好。希望本文能有开发第三方Android SDK的同学一些帮助,让开发中的坑更少一些。

本文作者:何红辉,Android工程师,现任职于友盟。乐于分享,热爱开源,开源项目有AndroidEventBus、android-tech-frontier、Android源码设计模式分析。

CSDN博客:http://blog.csdn.net/bboyfeiyu,GitHub
主页:https://github.com/bboyfeiyu


巧用CLIPBOARD建立图像数据库-VB资料 在VB中存取数据库中的图片 Access97的报表解决方案-VB资料 Access下如何使用通用对话框-VB资料 ADO简介 -VB资料 ADO三大对象的属性、方法、事件及常数(二)-VB资料 ADO三大对象的属性、方法、事件及常数(三)-VB资料 ADO三大对象的属性、方法、事件及常数(一)-VB资料 Data 控件使用有密码的 Access 数据库 -VB资料 Excel、Access、VB的结合应用 Microsoft SQL Server 7.0安装问题(二)-VB资料 主题: MDB文件的导出 使用 DAO-VB资料 Microsoft Access秘密、技巧和陷阱-VB资料 SQL的基本操作(1.数据类型) -VB资料 SQL的基本操作(2.数据库的相关操作)-VB资料 SQL的基本操作(3.表的相关操作) -VB资料 SQL的基本操作(4.数据的检索)-VB资料 SQL在VB中的使用及访问远程数据库 Text 转换为 Access MDB -VB资料 VB5.0数据库基础 非编程方式访问数据库-VB资料 VB用编程方式访问数据库 VB 5.0数据库设计技术讲座(4) VB5.0数据库编程经验小集 VB5在处理数据库时的几个“BUG” VB6.0中的几个新增数据库工具 VB处理数据库时求数据表记录总数的最佳方法 VB访问数据库的方案比较 VB数据库编程经验两则 VB数据库编空字段的处理 VB数据库多字段记录的录入 !求助,我的机子不能启动了。。。 XML中华网有好多的C#资料哦! 比较问题一道,关于 == 版主请进 ~ CrystalReport的一个奇怪的问题,Help! 唉,终于解决不了了,如何在运行时,改变LISTBOX的风格。MSDN说不能解决 AnsiString与TStrings之间的区别与联系,急! 有谁知道下载cobol的编译器,能在window下用的 各位兄弟、姐妹,谁能给我一个超星的账号阿!!谢谢了 再请教 Delphi的EXE 请问关于数组的问题 机器的速度太快,玩不了挖金子,有什么办法? web应用中使用Window ActiveX OCX技术存在问题 请教灰色凹下直线问题 jbuilder编译的问题 有关网络视频会议系统的开发模型问题??? 如何实现在DW中取数据? 如何注册一个DCOM,让它跑在别的机子上? 关于条码阅读器输入数据的控件 如何注册一个DCOM,让它跑在别的机子上? 开机后,总是弹出了一个窗口? 闲着没事,贴个歌词,先~~~ editbox控件问题 Delphi6安装之后怎么会… 请教一个非常难的问题,请高手入席! 如何实现在DW中取数据? 请教:我在CMyView中的菜单消息响应函数中调用一个对话框,为什么有的能打开,有的对话框打不开? 取消ADO大批量查询的问题 如何设置临时文件夹目录? 关于条码阅读器输入数据的控件 请问高级程序员考试什么开始报名在哪报? 如何捕获子线程中的Exception 请 li zhifu(东北人)进来看!!!!! VC简单问题来者有分!转换DDB到DIB 求《数据结构与算法(C#版)》:电子工业出版社. 多谢!!!!! access数据库里备注字段用英文怎么写 如何导入excel文件成为一个SQL表 莫名其妙的问题,DeleteBatch is not a member of TDBBaseSODetail 第一个告帮我怎么进入boland新闻组的人,100大分全给他! 请教高手!如何在属性页的标题上添加图标 CSDN上一个木马的源代码,我有疑问? EXCEL文件的导入 怎样在VC的添加虚拟函数或消息函数向导对话框中加入自己的虚函数和自定义函数 请教高手!如何在视图区附加一属性表(PropertySheet),使属性表覆盖窗口的视图区 选择release编译时出错 请教各位高手一个随机数的问题 vb中怎样循环播放音乐??? Access數據庫連接失敗. 有什么方法在WEB里把文件(*.doc)上传到SQL2k里? 微软(中国)总裁高群耀已经辞职,why?? 胶粒为何带电在胶体中存在的微粒准确地说是胶团,胶体就是由胶团组成的.胶团是由胶核、吸附层、扩散层构成的.胶核又是由许多分子或其他微粒聚集而成的,它具有强吸附能力,在胶核的外 拉曼光谱在化学中的应用 温度与大气压有什么关系? 对于层流边界层,_和 _都将加速边界层的分离(A)减少逆压梯度和减少运动粘滞系数 (B)增加逆压梯度和减少运动粘滞系数(C)减少逆压梯度和增加运动粘滞系数 (D)增加逆压梯度和增加 为什么土壤胶粒带电? 怎么读?汉语读出来? 中国与外国分别是怎么划分家的边界的.有什么不同.为什么会有差异 如何解释胶粒的带电性? 中文怎么读 气旋,反气旋会带来怎样的天气?降雨?降温.或者怎样? 胶粒一定带电吗?有没有可解释的理由?我想问的是为什么胶粒一定带电 平方米是不是计量单位 气温和降水的规律和判断. 第三次科技革命成就 周米是什么计量单位 流体力学:二维平板在水面作边界层实验,已知临界雷洛数,动力粘度,为保证全平板为层流,平板长度应不超多少原题目:用一块二维平板在水面上作边界层实验,已知临界雷洛数Re*=5*10^5,水的动 在第三次科技革命 中,中国取得了哪些成就? 初中地理和生物怎么也学不好怎么办? pa和psi 都是压强单位,但psi在地球和月球上值是不一样的,但pa不会变.是不是? 第三次科技革命的产物电子信息方面的, 我现在八年级上学期,我的生物地理烂到令人咋舌,到初三一年就不学这两门儿科了.现在八上放寒假了,生物地理都学了三本书了,但是我一本都不会,想乘暑假赶快补一补.我想问,就是说是不是 液力上的par、psi、pa和公斤的转换关系? 第三次科技革命中,中国取得了哪些突出成就 举例说明科学技术的飞速发展给人类带来哪些深刻的影响?4分,两方面 有个汉字只是个四点底咋读 一个城市在台风过境前后的风向怎么确定?比如说过境前台风在城市的东南方,过境后在城市的西南方.如果有例题提供的话更好了举例:台风位于上海的东部,此时上海吹偏南风呢,还是答东 如何看待科学技术在社会发展中的作用 汉字英文咋么读 台风过境时气压变化?变化幅度是大还是小?48.下列四幅图中,表示台风过境气压变化的是( )A和B选项有疑问,都是气压先降低再升高,为什么选B不选A?是台风过境时气压变化幅度很大吗? 物理流体力学The siphon is used to transfer liquid from a higher level to a lower level.If the fluid is drawn up and is continuous through the tube,determine the velocity of flow of gasoline if the vertical distance from the liquid surface to th 怎读用汉语翻 某地台风过境前,过境时,过境后的风速、气压、风向、降水情况? 物理流体力学题在20平方千米的湖面上下了一场50mm的大雨,雨滴半径为1.0mm,设温度不变 雨水在此温度下的表面张力系数为7.3*10^(-2)N/m,求释放出的能量S要用雨滴的表面积减去湖面的表面积 弄不 邮箱中的@在汉语中应读什么字 台风过境的地方前后,该地的气压和风速有什么变化 班级辩论会,信息技术对人类社会的影响题目是信息技术对人类社会的影响!我是反方要信息技术对人类社会不好, 迷路的英语用汉语咋读 扇形的面积怎么算?周长呢?弧度?还有,l在里面代表什么? 如何判断电场力、电场强度、电势能、电势的大小与方向?包括电场线求解 求解电场强度 电势 电势差 电势能 等势面的关系,有没有很形象直观的理解方式啊本人今年高二预科,被这几个概念搅和得稀里糊涂,求各位高手们、大神们救我于水火之中,感激不尽啊! 风速、气温、气压在多少的情况下不利于气味的传播距离大概100-150米 光在真空中传播时能量会损耗吗?如果会,那么这些能量去哪了? 怎么读,用汉语表示出来 热带风暴发生时气象(气压、温度、风速、降雨量、云的种类等等)变化,热带风暴发生时气象(气压、温度、风速、降雨量、云的种类等)变化主要是温度和降雨量还有风速 光在空气中传播能量损耗有多快? 分别怎么读 用汉字表示 在流体力学中,流速大压强小.所以如果飞机在高空打开舱门,那么舱内气体会高速向外流动,形成持续的强风.为什么不是流动到舱内外气压平衡以后就停止流动,而是形成持续的气流呢?换句话说 太阳光线经过镜面反射 能量损耗吗?/太阳光线经过镜面反射 能量损耗吗?/ 44个音素怎么读?用汉字表示. 请问g和L各代表什么计量单位 一个关于大学普通物理流体力学的问题,求解题过程和思路在水坝上有铅直的门,它的上缘和水面相平,们的高和宽分别为3m和4m,并用铰链连结在经过门的中心的水平枢轴上,试计算门所受的压力 为什么在圆柱绕流中超临界(湍流边界层)扰流分离点较亚临界(层流边界层)靠后,是湍流更易克服逆压梯度吗 g/L表示什么计量单位?如:血红蛋白≥100 g/L 科学技术的发展给人们的生活带来了哪些变化? 这个怎么读中文和写出来 流体力学的现有理论是在假设开始的?(为了便于分析把复杂多变的流体运动假设.线性流动等等) 计量单位hm 为什么胶粒可带电而胶体呈电中性? “A为一个标准计量单位”是什么意思在排版中,看到一些资料上面有“A为一个标准计量单位”,有具体的数据值么? 科学技术的发展,使我们的生活发生了巨大的变化,同时,也带来了新的问题.那么,科技发展利力大还是弊大请你仿照课文的写法,用具体事实说明你的观点.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘