Android应用内社区SDK技术架构浅析

Android应用内社区SDK技术架构浅析应用内微社区是什么 ?

图1 图2

一、以友盟微社区为例

简单来说,友盟的微社区就是一款帮助开发者在应用中快速搭建一个社区( 类似于新浪微博、朋友圈 )的产品。在很多应用中,开发商往往都会需要一个用户之间以及用户与开发商之间互动的社区,用户往往又会在社区里选择赞、评论、关注、转发、发帖等各种互动方式。但是开发一个社交系统可不是那么容易的一件事,复杂的用户关系、消息流、服务器架构等等都是棘手的问题,更重要的是大家都是重复地劳动!每个开发商需要这些功能的时候都需要从头开始构建这么一个开发成本很高的社交系统。友盟为了解决这些问题推出了友盟微社区SDK (内测阶段) 这款产品,它可以让你以SDK集成的方式快速的构建一个社区,大大提高了生产力和用户活跃度。

1.1 友盟微社区的特点

如图3、图4是云图TV的集成效果。

图3 图4

二、技术架构

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

UI层 (开源) UI层对外开放,目的是让用户能够定制友盟微社区的UI效果,使微社区SDK能够很自然的融入到用户的App中。

业务逻辑层 业务逻辑层会通过一个统一的接口向UI层提供数据数据请求等功能,比如获取缓存的feed、好友列表等,因此业务逻辑层对于用户来说是一个数据操作接口,通过这个接口用户能够与SDK 核心层进行一些数据方面的操作。

核心层 核心层则包含了友盟SDK的核心系统抽象,比如账户系统、推送、数据库、网络操作等,这一层对外封闭,用户可以通过一些接口与核心层进行交互。而核心层定义的抽象使得用户可以很方便的实现定制化,即自己实现抽象接口,然后将具体的实现注入到友盟微社区中,从而使自己的子系统替换掉微社区中的默认实现 (下文会给出示例 )。

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

图 2-1 洋葱结构图

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

图 2-2 层次结构图

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

三、友盟微社区的定制化3.1 如何满足定制化 ?

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

图 3-1

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

<Map<String, T> mImplMap = new HashMap<String, T>();// 要使用的实现的keyprivate String mCurrentKey = “”;(String key, T impl) {mImplMap.put(mCurrentKey, impl);}(String key) {mImplMap.remove(mCurrentKey);}(String key) {mCurrentKey = key;}public T getCurrentImpl() {return mImplMap.get(mCurrentKey);}(T impl) {if (impl == null) {return;}mCurrentKey = impl.getClass().getSimpleName();mImplMap.put(mCurrentKey, impl);}}

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

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

<LoginSDKManager sInstance = new LoginSDKManager();private LoginSDKManager() {}LoginSDKManager getInstance() {return sInstance;}}

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

3.2 示例等待故人的归来。山上的树,大多数是松树比较突出。

Android应用内社区SDK技术架构浅析

相关文章:

你感兴趣的文章:

标签云: