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

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


同洲电子推出首款手机操作系统960OS 免费授权使用 如何在Windows 8.1的IE11中打开同步选项卡? 25年老对手评价微软:换CEO可行,但是太迟了 【PPT集萃】十位一线专家分享Spark现状与未来(三) 万元奖品等你拿!2014创客118新年大Party! Firefox OS的2013回顾和2014展望 Strom8 CEO:搞好手游开发,合伙人很重要 2013年Q4全球PC出货量同比下滑6.9% 已连续下滑七个季度 一周消息树:2013年十大产品、图书、公司盘点 专访Wunderlist主设计师Jan Martin:永远不要盲目跟风流行趋势 研发周报:超实用的JavaScript技巧及最佳实践 2013最吃香的技能:Java称霸、Android势头正猛 移动周报:最火原型设计工具盘点 “京东电商云”起航,零售企业及品牌商是重点 教育乃立国之本:教育类开源项目大汇集 Hugo Barra首度谈离开谷歌后在中国工作的感受 对中国赞不绝口 母婴行业最早试水者 优谈宝宝借助轻应用全面布局移动产品线 腾讯云平台部总经理纪顺友:微云将彻底迈过文件传输的门槛 豌豆“荚”油!B轮融资1.2亿美元的豌豆荚 2013年终盘点:10款最精巧的硬件开发板 SquareWear:可替代Lilypad Arduino的开发板 开放数据:2014年最热门的竞争领域 IE11虚拟机免费面向广大开发者 九城搭建的一个以Hadoop为基础的大数据平台 Windows 8复杂性的代价到底有多大? 在发布前,第一代iPhone其实并不完善 市场占有率调查:iOS 7秒杀Android 4.4 AWS会赢、OpenStack会消亡、Connected Cars可防僵尸攻击 谷歌以32亿美金收购iPod之父的创业公司Nest 物联网时代来临 微软2014,有你期待的吗? 映趣科技发布inWatch Z/inWatch X 后者采用全彩透明柔性屏 session 问题 如何在lotus中利用JAVA进行写代理,或哪里有较好的相关资料!如有好的帮助,定当另外再给分 虚拟现实,网络哪一个更有前途? 关于注册表 关于网络打印的问题?????????急急急 奇怪的现象。。 初学者问的基本的问题请大家指教 那里有编写ActiveX DLL网页的教程~ Unix或者Dos下怎么知道键盘有键被按下? 大家好 一个有意思的小任务,诚征实现程序 关于网络打印的问题?????????急急急 请问深圳IT行业人员薪资水平 请问谁知道那有关于售票系统方面的软件可以DOWN! windows2kserver 里的“本地策略”不能用? 我的2000因为WMI不能用了,谁能帮我,快!我在这等 灌水灌得差点忘了问问题~进来的有分。 一个有意思的小任务,诚征实现程序 我的2000因为WMI不能用了,谁能帮我,快!我在这等: 一个有意思的小任务,诚征实现程序 那位仁兄用过 installation system 请告诉我怎样设置才能使我的应用程序出现在“开始”菜单里 小弟急用 韩国队崛起大揭密:铁血作风 军人模式 地狱训练 vb中怎么动态生成按钮??? 请问:考中程怎样去复习,尤其是下午的题? java 的环境配置,请高手指教! 如何判断一个1024的int数组的所有元素的值全部小于50。寻求高速算法。 有谁看过Charles Petzold的《Programming Microsoft Windows with C# 》和Jeffrey Richter的《Applied Microsoft.NET Framework Programm 如何把图标加到 dll 文件中! 求助!!!哪儿能下载到VB高级编程的详细参考资料? 如何得到光标在编辑框中的位置?一个笨笨的问题 请教select函数用法!!!!! 关于日期计算的的错误!请关注!! 韩国人踢进八强 和 中国人相互掐架(转帖) vb中怎么动态生成按钮 如何修改Internet option/home page中的address CSDN如何上传文件啊? 请教c++的问题 滴水之恩,涌泉相报!!! REALPLAY不出声音 我想考scjp,不知道那个证有没有用? 哪儿有这样的软件? 电脑游戏与电子游戏 哪位有CRC-CCITT的表格,计算法就不必了 电子游戏与电脑游戏 如何用ASE12.5构建ODBC数据源并用ASP连接调用它? 关于c#版csdn助手的数据连接问题 有没有点击表头排序的listview控件? 我不会了(EDIT BOX问题),在线等 Delphi 用VB做数据库,同时保证远程SQL SERVER和本地ACCEE的同时更新,当远程连接不通时应该怎样做才能在本地顺利运行,而网络通畅时又能保证数 fopen与_open什么区别? 一项工程甲独做8小时完成乙独做12小时完成.若甲做1小时后由乙接替甲做,甲乙要用几小时完成总任务3/5 熬的形近字是哪个?组词最好!至少三个! 表示依依惜别的词语 甲单独做8小时完成乙单独做12小时完成若甲做1小时后由乙接替甲做,甲乙要用几小时才能完成总任务的3╱5? 勾股定理练习题已知三角形ABC中,三条边分别为a=n^2-1,b=2n,c=n^2+1(n>1).试判断该三角形是否是直角三角形,若是,请指出哪一条边所对的角是直角. 表示依依惜别的古诗词 一项工程甲独做8小时完成乙独做12小时完成,如甲做1小时后乙接着做几小时可完成全部的5分之3?急 呐字可以组什么词 初中校园广播稿,要有关校园生活的~急用,谢谢~! 一项工程,甲单独做8小时完成,乙单独做12小时完成,甲乙合作多少小时完成全部工程的, 呐 字怎么组词 校园生活的作文,写广播稿的.急~~~~~~~~~~~~~~~ 一个工程,甲单独这8小时完成,乙12小时,甲做一个小时后由乙接替,甲乙要用几个小时完任务5/3 寨字怎么组词 谁有《我的理想》600-700字 关于观点作文的问题!400字!仿照“真理诞生于一百个问号之后”的写法,用具体事实说明一个观点,求一篇400字的作文,复制自己写都可以啊! 请各位给我一篇题目为(关爱)的作文600字以上,不要多于900字,急用,quick quick quick quick quick quick quick quick quick quick quick quick quick quick quick quick quick quick quick quick quick quick quick quick quick quick quic 以惊喜为话题的作文 为什么小明14岁生日,妈妈插15支蜡烛? 呐喊的呐字可以组什么词 以“关注心理健康”为话题 800字作文 是作文 别弄些那些奇怪的! “豫”字组词要2个 教师节的作文《教师节我们应该为老师做什么》500~600字数,粘贴的不要! 是一篇作文! 勾股定理习题直角三角形ABC的周长为24,角C=90,且ab:bc=5:3,则ac=? 豫怎么组词 氢氧根的书写~帮我看看是否正确(还有那些数字是全部都小写的吧)NH4OH KOH NaOH Ba(OH)2 Al(OH)3 NH4NO3 勾股定理练习题已知等腰直角三角形abc,p是bc上一点,求证2倍的ap的平方=bp的平方+pc的平方 豫的意思+组词? 苏教版小学三年级英语中f小写的正确书写格式?看女儿写英语字母时发现她的f小写只占了两格,我特地到百度中重新查了下是写满三格的,那么到底哪种才是正确的呢? 勾股定理的题 豫有什么组词5个或5个以上 2012年如果写成汉字小写的话,正确的写法是() 某建筑工地上需要一个长宽高分别为2m,0.6m,3m的长方形立柱,现在只有底面积为0.3乘0.3的方钢,应该截取多少的方钢进行加工.(用方程做) 一项工程,甲单独做12个小时可以完成,乙单独做8小时可以完成,丙单独做9小时可以完成.三人合作1小时,续可以完成这项工作的几分之几?还剩下这项工程的几分之几? 《黄鹤楼送孟浩然之广陵》中借景抒情是?含蓄地表达对友人的深挚感情 一根木料长4米,用去了四分之一,还剩多少米? 一项工程,甲单独做要12小时完成.乙单独要10小时完成,丙单独做要15小时完成.如果三人合作.一项工程,甲单独做要12小时完成.乙单独要10小时完成,丙单独做要15小时完成.如果三人合作,多少小时 《这一刻,我认识了我自己》《又是新的开始》作文600字这两篇作文2选1,在半小时以内回答悬赏会高一点 用一根8米长的木头加工模型,做一个模型需要九分之四,已经做了6个这样的模型,还剩下多少米木头? 小学生运动会稿件之100米跑 60字 带人名3篇 某商店将甲、乙两种品牌的电冰箱同时卖出,其中甲种品牌电冰箱售价是1500元,盈利25%,甲种品牌电冰箱售价 三个木材的长度分别是1.2米、1.8米和2.4米,要把它们锯成一样长的木材而不浪费,每根最长应是几分米?一共可以锯成多少根? .1尽可能的多听英语歌曲.2找一些说英语的笔友写信给他.3经常听英语广播.翻译. 有关同学友情的演讲稿开头我要转学了.希望能借演讲抒发感情.一百字左右,再推荐几首背景音乐 小强,小刚和小明三人读同一篇文章,小强用了2/15小时,小刚用了1/6小时,小明用了0.2小时,﹙﹚的速度最快急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急 运动会稿子200字 谁有初一同学之间友情演讲稿?我要用. 小明、小刚、小强三人去卫生所找同一个大夫治疗.1.小明打针3分钟,小刚换药5分钟,小强取药2分钟,大夫按怎样的顺序处理,可使他们等候的总时间最少?最少要几分钟? 教师节就要即将来到了.改病句 求一篇题目为《考试前的一个晚上》的作文 400字左右 主要写心理活动的!知道得快! 送孟浩然之广陵 最能表达诗人情感的诗句是什么 修改病句 九月十日是教师节"九月十日是教师节"是一病句,怎样修改 简评唐僧! 古代四库全书指 求关于友情的演讲稿 用什么像什么,可以什么造句 《四库全书》指的是哪些? 演讲稿友情篇关于友情的演讲稿,要很一般的,也可以是差的,只想应付一下,大约800字左右,下午两点之前就要用,请大家帮帮忙,拜托了 我像什么,又像什么造句 旬字组词,加上旬的形近字组词
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘