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

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


在Delphi的DBGrid中插入其他可视组件 在Delphi的Socket编程中如何从服务器向指定的客户机发送信息? 在Delphi动态生成定义数据库 在Delphi中处理数据库日期型字段的显示与输入 在Delphi中简单实现多重查询 在Delphi中建立和使用别名 在DELPHI中使用ADO对象存取ODBC数据库 在Delphi中使用DBF数据 在Delphi中随意控制DBGrid 每一行的颜色 在Delphi中自动检测、建立数据库别名和表格 在存储过程中使用use database-Delphi资料 在一个Dbgrid中显示多数据库-Delphi资料 在运行期创建表-Delphi资料 怎样把可以使用的表名输出到一个选择框?-Delphi资料 怎样发布基于Microsoft SQL Server的程序-Delphi资料 怎样解决打开一个DBF表时的Index not found..错误-Delphi资料 怎样向SQL Server插入带有Image字段的记录-Delphi资料 怎样在Paradox表中加密码?-Delphi资料 自动Login数据库-Delphi资料 自动检测、建立数据库别名和表格-Delphi资料 自动注册Paradox-Delphi资料 Delphi 4增訂的Object Pascal Delphi 5 Enterprise版10大特点 Delphi 插件创建、调试与使用应用程序扩展 Delphi 程序制作要点 Delphi 中面向对象编程之我见 Delphi”程序级触发器”功能的实现 Delphi4.0系统提示信息的汉化 Delphi5优化 Delphi编程技巧十则 Delphi程序制作要点 紧急求助:VC.NET怎么导入资源文件。(高分) 如何连接.dbf的数据库(dBase). 下拉菜单问题 请问如果一个控件没有hwnd,怎样才能拿到它的hwnd?急! 简单问题 请问如果一个控件没有hwnd,怎样才能拿到它的hwnd?急! 请问如果一个控件没有hwnd,怎样才能拿到它的hwnd?急! 在设计ActiveX控件时,怎么得到该控件的HWND 请问浮点型的数据如何设置使它以科学计数法表示? 高分求教:VPOP3的使用方法? 500分求解:windows编程。 请教高手,关于用TCP/IP检测网络状态 一个关于注册 ODBC 的问题,请教高手 控件得到焦点时有OnActive事件,那失去焦点时是什么事件 哎,不知做什么软件才能赚钱? 请教跨域访问的问题! 请高手帮忙!一定给分! 怎样编程实现在ListBox里显示数据库表中一个列?(绝对放分) 那位有《101规约》给我一份,我实在不知道该到哪里去找!!!(50分求助) 关于对话框制作 关于例外 给Cisco认证提点建议!给分===== [求教]XML文档的参数中如有&符号如何处理。 [求教]XML文档的参数中如有&符号如何处理。 谁能给我提供免费防刷新的计数器代码……在线等待 请问出现下列错误,如何解决!(怎样察看每个OLE DB状态值) 会话状态设置中的SQLServer 模式如何应用? BUG!版主管理里的专题管理 session 没设置正确,请蝈蝈看看 有朋友问我学习C语言初中学历能学会吗? 大家帮个忙,很简单的问题,快呀,关于数据库的问题 请问vb怎么打开Access2000的数据库? 计算机并行口原理是什么 我在前台的程序中对text1.text=rs!number,为何text1.text的值还是空值,想不通??? GetSafeHdc() 的含义及用法 一个调用SQL数据库的问题! 如何ML一个装载地址不是4M的EXE文件(比如6M或8M) 谁能说说从一个ListView拖动文件到另一个ListView中 如何在程序结束时播放一段动画再结束!!!!! 我要书 下面是我的存储过程,为什么多人操作的时候会发生死锁呢,急呀! 谁知道炖鸡怎么炖啊?加什么料? 如何使鼠标点到对话框外时关闭对话框?(方法越多越好) 国家安全部门使用什么操作系统? “用户级虚拟机”调试应用程序的有几种实现方式,谁能说说???? 如何优化程序,使他减小占用系统资源? 请问怎样同时显示简体和繁体汉字? 我想查找字段为'注册类型'中包含'公司'的所以有记录 帮帮忙,SQL Script Recovery如何获得注册码? 如何“引用结构中的结构的数据”,比如MSG中的POINT鼠标结构 用一个Query动态生成并执行SQL语句 哪里可以下载到有关oracle 9i的电子书? they came running over翻译,为什么come 后是running People don't feel like doing simple jobs over and over again改同一句People ( ) ( ) ( ) do simple jobs over and over again中间有4个空应该是People ( ) ( ) ( ) ( ) do simple jobs over and over again 谁知道take your time的意思?不能以字面意思做回答! they come to us over and _____ again.A.on B out C.above D.over选哪个?为什么?意思是? ax2+bx+c=0(其中a\b\c均为常数,且满足b2-4ac>0),写出两实的表达式 这次的希望英语大赛有没有笔试?2009年的,快, If you love to go back,we again 英语翻译真不好意思,那么晚才回你邮件,最近我换了一个新的工作,是做环球期货的,我非常喜欢这份工作,在那里我学到了很多东西,果然做自己喜欢做的事情,是不会觉得累的,哈哈!我女朋友比 C语言中,a,b,c,d为double类型,数学表达式为5ab/7cd,在电脑中表达式5/7*a/c*b/d为什么是错的 方程2x+y=3的正整数解是 I Came .I came again.翻译是什么 中国的电器在美国如何使用 鸦片战争以来,中国社会各阶级分别提出了哪些建国方案?结局怎样?从中可得到哪些历 英语翻译还有这个句子:"if God choose,Ishall but love thee better after death. 当太阳升起等我回来接你 什么歌 1. 鸦片战争以来,中国社会各阶级分别提出了哪些建国方案?结局怎样?从中可得到哪些 表达式“989”>“99”的值为False,这道题为什么不对? 歌词:火红的太阳升起在金色的西藏...是什么歌名?歌词:火红的太阳升起在金色的西藏唉藏族人民纵情歌唱.世界屋脊汽笛入云天万里高原凯歌传四方...这是上世纪70年代唱的歌,不记得歌名 40.鸦片战争以来,中国社会各阶级分别提出了哪些建国方案?结局怎样?从中可得到哪些 "989" > "99"表达式值为F嘛?为什么下面表达式的值是False的有( )."989" > "99" Instr ("Visual basic","b")>0 "2000 >1997 " "3" > "2" 你去哪里了 用英文怎么说 大家推荐英语四级历年真题详解吧.最好有2010年12月的试题,王长喜的好吗?有用过的吗?王长喜点评历年真题 16版第二次修订 还是17版二次修订好? 大约8点15分 英文 知道长方体的三条棱长,求对角线长的公式是什么 王长喜英语四级真题包含2011年12月的题什么时候出版 谁告诉我时间用英语怎么表达?比如,八点十五或者什么的,有没有什么规律! 长方体的三条棱长分别为1、3、5,则它的对角线为? 1912年当时中国都有哪些报刊? think over(翻译成中文) “你们去吗”用英文怎么说? 现在中国最有名的报纸是什么? But think it over and guess again .是什么意思 长方体的棱长总和怎么算1.长方体有{6}个面,每个面都是{长方}形,也可能有两个相对的面是{正方}形,{ }的面积相等.有{12}条棱,{ }的棱的长度相等.2.一个长方体的长是1.宽是1.2 英语翻译 请问这篇作文有没有语法错误? 当a取何整数值时,关于x的方程2分之1ax-3分之5=2分之1(x-3分之4)的解是正整数?明天我就来收,希望能有人解答的出来,如果不明白题意的可以用百度HI我,注意: dark lady watch over you!帮忙翻译下 小琳用计算器求三个正整数a,b,c的表达式(a+b)/c的值.她依次按了a,+,b,÷,c,=,得到数值11.而当她依次按b,+,a,÷,c,=时,惊讶地发现得到数值是14.这时她才明白计算器是先做除法再做加法的,于是她依次 阮籍咏怀八十二首的风格特征 Madeleine Peyroux--To Love You All Over Again 歌词翻译歌词: A quiet room is what you get, an empty glass, an unmade bed,A picture window with a view, and all I think about is youTo feel so bad, to feel so good, to let it be misunderstood,Now 这篇短文有没有语法错误How are you doing?My uncle Li Ming will leave for your citiy to attend a meeting.He will bring the Chinese picuture that you want to have for you.The picutre is very beautiful and I think you must like it.I hope you c ALLEY BAR怎么样 You are free to come over and visit again 最好再讲一下come over 的用法 改同义句:She gave some bread to me .She( ) ( ) ( ) ( ). 后巷酒吧THE ALLEY怎么样 翻译I suggest that you tear up the letter and start over again. 哪位高手帮忙用C++做一个求复杂表达式的计算器~RT,要满足下列要求,不胜感激啊~(1) 数值:包括整数和实数,数值可带正、负号.(2) 一般运算符:正号、负号、加、减、乘、除、求模和乘方,其 take your 什么情景可以用? Money用them还是用it这样一道题:He has no _____ ,please ______?A.moneys; give him it B.moneys; give it to him C.money;give them to him D.money;give him them.应该选几呢? 连词成句:she to and mother them some Jack's Peter give then gave forgot birthday but cakes 英语翻译“The Alley Alley O”该怎么翻译?是不是国外的一个地名或者特指什么?原文出处:YeahThe big ship sails through the Alley Alley OThe Alley Alley OThe Alley Alley OThe big ship sails through the Alley Alley OOn the la If kids are given some money a week or a month,it will do them good,because they will learn how to use money. But Lana has other suggestions:Help them plan. “If there’sa big-ticket itemyour child wants,” says Lana,“help him plan how long 翻译句子:亲爱的妈妈,我爱你,我今天真的错了,请原谅我 take your time中文意思 We will raise some money for them,t_______.It can help many children go b_____ to school. people don't feel like doing simple jobs over and over again 我要参加一个英语演讲,要求一分钟自我介绍,一分钟才艺表演,请问我一分钟才艺表演表演什么?大家帮我出出主意!我明天就要我去的!哪位好心的高明大师帮我想一下? 英语翻译The co-SPI membranes with smaller IEC values displayed much lower WUsand the dimensional changes in thickness direction were significantlydecreased,though the expansion in plane direction didnot change too much or even became stronger.The Tom doesn't feel like doing such simple jobs over again.怎样改同义句 Take Your Time Fast ForwardLucky StarStayMyBaby能和这几首差不多好听的就行 这几首是Amy Diamond唱的
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘