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

从友盟微社区看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


Android蓝牙API之BluetoothSocket类(2) Android蓝牙API之BluetoothSocket类 Android蓝牙API之BluetoothAdapter类(1) Android蓝牙API之BluetoothAdapter类(2) AndroidManifest.xml文件剖析 (三) AndroidManifest.xml文件剖析 (二) AndroidManifest.xml文件剖析 (一) MOTODEV初体验,高效Android开发工具 Simple让BASIC语言编写Android程序 MOTODev试用报告- Android开发效率之源 安装MOTODEV Studio for Android版方法 Android开发工具-motoDEV studio介绍 Android过后Chrome OS又是如何开发? Android安全模型导致开发时功能受限 Android导出一个JAR库 APK汉化原理及方法 APK文件格式分析,Android反编译入门(一) ApiDemos中的Android Widget例子解析 APK签名导出向导 - Use the Export Wizard 剖析Android自带Widget - Music播放器 剖析Android自带Widget - Clock指针钟表 C#取得Excel工作簿工作表名称 C#中用Automation自动化方式对Excel的操作 VB如何打开或保存为有密码保护的Excel sheets工作表 VB在Excel表格文件中搜索指定内容 VB复制Excel表到另外一个Excel中 Java实现生成网站快照缩略图片 php实现生成网站快照缩略图片 C#实现生成网站快照缩略图片 VB比较两个Excel表格的内容 VB实现Excel按列或行排序 如何选择三层架构的中间件产品? 小呆猫谢谢了,再请教一下。。。 我想问一下,如何能在程序中锁定键盘和鼠标 西摩斯(厦门)医疗软件开发有限公司急招精通Delphi,MS SQL Sever软件设计师! 大家帮忙啊... 关于 int[][][] a = new int[3][3][3] 再问clavy(有巢无车氏) 和 wqxtt(wqxtt) 关于WINCE 下ACCESS 与 WINDOWS 下ACCESS 的转换 关于C/S结构的问题?快帮我啊!!! 各位programer加班有加班工资吗? 代理服务器的原理?——有谁知道! 请问怎么在一个对话框程序的文本框中绘图 请问windows网络程序PING编程技术里的几个问题,ICMP回显里面的timestamp是怎么纪录进去的 什么地方可以Down rose?或谁寄给我一个? 编写一个函数,通过指针连接两个字符串!!!!!!!!!!!! 用applet怎样打开一个文件吗? 请问哪种ORB产品实现了com服务器/corba客户机的桥 我读《深入探索C++对象模型》的感受,cber能再回答我一次么? 谁有DELPHI的有关网络编程方面的资料?给我一份可以吗? 关于stringgrid的问题????? 痛苦啊,难道要放弃BCB吗? 大家认为在开发过程中是否不能用全局变量? 如何让LINUX支持我显卡 高手,谁来帮我一下~! 取字符 在SDK中,如何获得客户区的宽度和高度呢??(哪两个函数呢?) 哪里有ATL的电子书下载?最好是中文的! 高手谁能帮帮我呀~~~~~~~! 请教:如何在statusbar的panel中显示一个图标呢? VC++中如何使用OLE对象? 初来乍到,发现这儿JJMM还挺多的。。。 请高人指教~! CSDN中碰到这种问题,该如何解决呢? 如何学习director 你能帮我一下吗?~ 企业商务管理软件,开放全部的源代码及开发文档! 企业管理软件,全套源码及开发文档!!!! 哪里有支持任何波特率的通讯控件下载? net_lover(孟子E章)请进~! 一个有关CWebBrowser的问题,急急急!!! 这样的语句为什么不可以实现一次删除多条记录 plmm是什么意思? 各位大侠,知道哪儿有直接可用的上传文件的控件吗? 多谢了!!! 论坛的题目是不是太没意思了 一个sqlserver7统计的问题?? varchar类型不是可以输入255个字符吗,为什么我输了160个就出现'item XXX doesn't pass validation test ' 唉 ~~~~~ 奈何 ~~~~~ 突然想到个荒唐的问题: 事件和过程有什么不同? 奇怪的事前,高手请进来 我的问题还没有解决~! 这里的高手呢,人听多,会的人不多 申奥倒计时,如果你在线,请进来验证这以历史性时刻,谢谢 如图:己知∠BAD=∠CBE∠ACF,∠FDE=58∠DEF=45,求三角形ABC各内角的度数 在锐角三角形abc中,角A=2角B,则b/b+c的范围 已知,如图,在三角形abc中,AD,AE分别是三角形ABC的高和角平分线,试问角DAE与角C-角B有怎样的数量关系,说明理由 如图.在三角形abc中,ab=ac,点d,e,f分别在bc,ab,ac上,bd=cf,be=cd,角fde=58°,求角c的度数 在锐角三角形ABC中,角ABC所对边为a.b.c已知b=2,c=3,sinA=(2√2)/3求三角形ABC的面积及a的值 如图,已知,AF分别是两个钝角三角形ABC和三角形ABE的高,如果AD=AF,AC=AE,求证:BC=BE 在三角形ABC中,角A、角B、角C的对边分别是a、b、c,下列条件中,能判断三角形ABC为直角三角形的是( )A.a+b=c B.a:b:c=3:4:5C.a=b=2c C.∠A=∠B=∠C 在锐角三角形ABC中,根号3a=2csinA(1)确定角C大小.(2)若c=根号7,且三角形ABC的面积为3倍根号2/2,求a+b的值. 已知:如图,AD,AE分别是三角形ABC和三角形ABD的中线.如图,AD,AE分别是三角形ABC和三角形ABD的中线,且BA=BD.求证:AE=二分之一AC. 在△ABC中,∠A,∠B,∠C的对边分别是a,b,c判断该三角形是否是直角三角形?并指出哪一个角是直角?(1)a=根号3,b=2根号2,c=根号5 (2)a=5,b=7,c=9 (3)a=2,b=根号3,c=根号7 (4)a=5,b=2根号6,c=1 在锐角三角形ABC中,角A,B,C的对边分别为a,b,c,且根号下3a=2csinA (在锐角三角形ABC中,角A,B,C的对边分别为a,b,c,且根号下3a=2csinA (1)求角C的大小; (2)若c=√7,a+b=5求三角形的面积 如图,AD是三角形ABC的中线,AE垂直AC,AF垂直AB,且AE=AC,AF=AB,求证:AD=1/2EF 在直角三角形ABC中,角C=90度,过点B作BD平行AC且BD=2AC连结AD判断三角形ABD...在直角三角形ABC中,角C=90度,过点B作BD平行AC且BD=2AC连结AD判断三角形ABD形状并说明理由(角C=90度,就是一个直角梯形上底 在锐角三角形ABC中,a,b,c分别为角A,B,C所对的边,且√3a=2csinA.(I)确定角C的大小: 如图,三角形ABC中,角BAC等于120度,AD垂直BC于D,且AB+BD等于DC,求角C的度数 在直角三角形ABC中,角C=90度,若A+B=13,且该三角形的面积是22.,则C等于-----. 在锐角三角形ABC中,a b c 分别是角A B C的对边,且√3a-2csinA=0①求角c大小②若C=2,求a+b的最大值 已知:如图,在三角形ABC中,AD垂直于BC,垂足为点D,AD^2=BD*DC.求证:三角形ABC是直角三角形.今晚之前给我,最好8:15之前交给我 在直角三角形ABC中,角C=90度,其中a:b=3:4,c=40求三角形ABC的面积? 在锐角三角形ABC中,已知a=6,c=2√3.三角形ABC的面积为3√3,则角B等于多少? 如图,在三角形ABC中,已知角BAC=120度,AD垂直于BC,AB+BD=DC,求∠C的度数. 在直角三角形ABC中,a+b+c=90,且a=40,求三角形ABC的面积 在三角形ABC中,A,B为锐角,角A,B,C所对的边分别是a,b,c,且sinA=√5/5,sinB√10/10(1)求A+B的值(2)若a-b=√2-1,求a,b,c的值 如图9,三角形ABC中∠BAC=120°,AD垂直BC于点D,AB+BD=DC求∠C的大小 在直角三角形ABC中,角C=90度,若A+B=13,该三角形的面积是22,则c=--------. 在三角形ABC中,∠A=90°,角平分线AE,中线AD,高AH的大小关系为 如图 在三角形abc中,bd=dc,∠1=∠2,求证:ad垂直bc. 在直角三角形abc中,角c=90度,已知a:b=3:4,c=10,求三角形面积 在三角形ABC中,角A=90°,角平分线AE、中线AD、高AH的大小关系是? 如图,三角形ABC全等于三角形A'B'C',AD,A'D'分别是三角形ABC,三角形A'B'C'的如图,三角形ABC全等于三角形A'B'C',AD,A'D'分别是三角形ABC,三角形A'B'C'的对应边上的中线.AD与A'D&# 在直角三角形ABC中,角C等于90°,AB、BC、CA的长分别为c.a.b,求三角形ABC的内切圆 在三角形ABC中,AE,AD,AH分别是角平分线、中线、高线,角A=90°的大线关系是? 如图 三角形ABC相似于三角形A'B'C',相似比为k,AD A'D'分别是边BC B'C'上的中线,求证AD比A'D'等于k 用反证法证明:三角形ABC中至少有两个角是锐角.请写明过程. 已知三角形ABC中AB=AC,AD和BE是三角形ABC的高,相交点H,且AE=BE求证AH=2BD 如图 在三角形abc中,d是ab上一点,且ad等于cd等于bdde,df分别是角bdc和角adc的平分线,求证:四边形cfde是矩形 已知:锐角三角形ABC中,角B=2角C,求证:角A>45度.(用反证法证明) 在三角形ABC中,AB=AC,高AD,BE相交于H,且AE=BE,试说明AH=2BD.自己画图 如图,在三角形ABC中,角B=44度,角C=72度,AD是三角形ABC的角平分线.(1)求角BAC的度数;(2)求三角形ADC的度数 已知锐角三角形ABC中,角B=2倍的角C,用反证法证明角A>45度 在三角形ABC中,AB=AC,AD和BE是高,它们相交于点H,且AE=BE.求AH=2BD在星期6晚上截止,有急用~图自己画吧... 如图,在 三角形ABC中,角C=90度,AD平分角BAC,且角B=3倍的角BAD,求角ADC的度数 用反证法证明:在三角形ABC中,若角C是直角,则角B一定是锐角.马上要, 已知 如图,在三角形abc中,AD,AE分别是三角形ABC的高和角平分线,若角B=30°,角C=50°.【1】求角DAE的度数(已解);【2】试写出角DAE与角C-角B有何关系(证明) 如图,AD为三角形ABC中角BAC的角平分线,DE为三角形ABC的中线.若三角形ABC的面积为24平方厘米,AB=8cm,AC=4cm,则三角形BED的面积为多少?要过程!急! 如图,已知 ∠ABC=∠ACB CE⊥AB于E BD⊥AC于D △BEC≌△CDB么 用反证法证明:在三角形ABC中,若C=90度,则角B一定是锐角 AD,AE分别是三角形ABC的高和角平分线,若角B=30度,角C等于50度,求角EAD的度数 已知,如图,在等边△ABC中,点D,E分别在BC,AC上BD=CE,AD与BE交与F.求:如果AB=12,BD=4,求S△BDF:S△BEC 已知三角形ABC,角ABC分别对应边abc 且1/a+1/c=2/b.证明角B是锐角 三角形ABC中,AD、AE分别是三角形ABC的高和角平分线,∠C=60°∠B=28°求∠DAE 如图,在△abc中,ab=ac,bd=cf,be=cd,∠fde=58°求∠c的度数 已知三角形ABC三边abc的倒数成等差数列,证明:角B为锐角 已知,如图在三角形ABC中,AD,AE分别是三角形ABC的高和角平分线,若∠B=30度,∠C=50度.①求∠DAE的度数②试写出∠DAE与∠C-∠B有何关系(不必证明) 三角形ABC中,AB=AC,BD=CF,BE=CD,角FDE=58度求角A图 在锐角三角形abc中,角A,B,C的对边为a,b,c且(且(2a-c)cosB=bcosC ⑴求角b大小 ⑵设向量m=(sinA,1),n=(3,cos2A),求向量m*向量n的范围. 在△ABC中,∠B>∠C,AD为三角形的角平分线,AE为高线试说明∠DAE=1/2(∠B-∠C) 如图在△ABC中,点D,E,F分别在BC,AB,AC上,且BD=BE,CD=CF,∠A=70°,求∠FDE的度数 如图,已知锐角三角形ABC中,角A,角B,角C的对边分别是a,b,c.(1)试说明S△ABC=1/2absinC (2)若a=30cm,b=36cm,∠C=30°,求△ABC的面积 如图,在三角形ABC中,AD是BC边上的高,AE是三角形ABC的角平分线.若角B等于α,角C等如图,在△ABC中,AD是BC边上的高,AE是△ABC的角平分线。若∠B等于α,∠C等于β(α<β),用含α,β的代数式来表示
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn