Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android應用內社區SDK技術架構淺析

Android應用內社區SDK技術架構淺析

編輯:關於Android編程

Android應用內社區SDK技術架構淺析

應用內微社區是什麼 ?

p1 p2 圖1 圖2 雪球財經應用內社區

一、以友盟微社區為例

簡單來說,友盟的微社區就是一款幫助開發者在應用中快速搭建一個社區( 類似於新浪微博、朋友圈 )的產品。在很多應用中,開發商往往都會需要一個用戶之間以及用戶與開發商之間互動的社區,用戶往往又會在社區裡選擇贊、評論、關注、轉發、發帖等各種互動方式。但是開發一個社交系統可不是那麼容易的一件事,復雜的用戶關系、消息流、服務器架構等等都是棘手的問題,更重要的是大家都是重復地勞動!每個開發商需要這些功能的時候都需要從頭開始構建這麼一個開發成本很高的社交系統。友盟為了解決這些問題推出了友盟微社區SDK (內測階段) 這款產品,它可以讓你以SDK集成的方式快速的構建一個社區,大大提高了生產力和用戶活躍度。

1.1 友盟微社區的特點

UI開源; 可作為SDK嵌入已有應用 ; 可一鍵生成獨立APP; 賬戶系統、圖片加載等核心組件可定制; 先進的anti-spam,自動肅清垃圾信息;

如圖3、圖4是雲圖TV的集成效果。

p1 p2 圖3 圖4

二、技術架構

從項目結構上來說,友盟微社區SDK可以簡單分為如下三層:

UI層 (開源)
UI層對外開放,目的是讓用戶能夠定制友盟微社區的UI效果,使微社區SDK能夠很自然的融入到用戶的App中。

業務邏輯層
業務邏輯層會通過一個統一的接口向UI層提供數據數據請求等功能,比如獲取緩存的feed、好友列表等,因此業務邏輯層對於用戶來說是一個數據操作接口,通過這個接口用戶能夠與SDK 核心層進行一些數據方面的操作。

核心層
核心層則包含了友盟SDK的核心系統抽象,比如賬戶系統、推送、數據庫、網絡操作等,這一層對外封閉,用戶可以通過一些接口與核心層進行交互。而核心層定義的抽象使得用戶可以很方便的實現定制化,即自己實現抽象接口,然後將具體的實現注入到友盟微社區中,從而使自己的子系統替換掉微社區中的默認實現 (下文會給出示例 )。

如圖2-1所示,友盟微社區SDK層次分明,通過這三個層次的隔離,使得用戶既可以自定義最外層的UI效果,也對外隱藏了業務邏輯層、核心層的實現細節。而核心層定義的子系統抽象,使得用戶可以注入自己的實現,保證了整個微社區SDK的靈活性、擴展性。

onions
圖 2-1 洋蔥結構圖

簡單來說,就是用戶在UI層通過邏輯層暴露的通用接口來操作友盟微社區SDK,從封閉的核心系統中獲取、存儲數據以及其他的相關操作。層次結構如圖 2-2所示。

layer
圖 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所示 。

sdk
圖 3-1<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPlNESyBNYW5hZ2VyysfSu7j2t7rQzcDgo6zA4NDNVL7NtPqx7cHLvdO/2sDg0M2jrLHIyOfJz8r2tcRMb2dpbmFibGW1yKGjzai5/be60M3O0sPHvs2/ydLUvavV4tCpzajTw7XEzO2806Gi0saz/cq1z9a1yLLZ1/ez6c/zu6+jrLHcw+LW2Li0tPrC66GjtPrC68jnz8LL+cq+OjwvcD4NCjxwcmUgY2xhc3M9"brush:java;"> public abstract class SDKManager { // 泛型Map private Map mImplMap = new HashMap(); // 要使用的實現的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); } public void addAndUse(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,代碼如下所示。

public final class LoginSDKManager extends SDKManager {
    // 單例對象
    static LoginSDKManager sInstance = new LoginSDKManager();

    private LoginSDKManager() {
    }

    // 獲取單例對象
    public static LoginSDKManager getInstance() {
        return sInstance;
    }

}

在用戶需要對登錄系統進行管理時,通過LoginSDKManager.getInstance()就可以獲取到負責管理登錄系統的SDK Manager,此時用戶可以通過addImpl(String key, T impl)useThis(String key)等接口對登錄系統進行管理,這就就可以靈活使用用戶自定義的子系統。

3.2 示例

下面還是以一個示例來說明問題吧。
在與用戶溝通的過程中,我們發現登錄模塊是用戶自定義概率最高的子系統。通常情況下,用戶可能有自己的賬戶系統或者使用了第三方登錄( 比如友盟社會化組件 ),此時用戶就不需要友盟微社區SDK中附帶的登錄實現,完全依賴自己的賬戶系統或者其他第三方登錄SDK來實現一個登錄系統。下面我們就以實現登錄系統 ( 其他子系統的自定義原理一樣 ) 來演示自定義過程。

在開始之前,我們需要對登錄的抽象接口Loginable進行了解。代碼如下所示:

public interface Loginable {
    public void login();
    public void logout();
    public boolean isLogined();
}
login() : 登錄函數,用戶需要在登錄成功後將用戶信息回調給友盟微社區SDK (具體過程可以參考友盟微社區集成文檔); logout() : 登出函數,注銷用戶的登錄即可; isLogined() : 用戶是否登錄,返回true表示已登錄,否則為未登錄。

微社區SDK內部通過抽象了幾個簡單接口來定義登錄模塊的功能,用戶通過實現這幾個函數即可定制自己的登錄系統,最後將實現諸如到友盟微社區SDK即可。例如,如果你的應用中已經有了自己的賬戶系統邏輯,你可以在Loginable的幾個函數中通過調用你的賬戶系統邏輯實現這幾個功能;如果你使用了友盟社會化組件 ( 注意 : 雖然友盟微社區SDK的登錄模塊使用的是友盟社會化組件,但它們的jar文件並不是一致的,因此不管你使用其中哪一個實現,都需要更新所有與登錄相關的jar文件。 ),那麼你可以通過友盟社會化組件的登錄、登出功能實現對應的功能,例如你可以在login()函數中調用UMSocialService對象的doOauthVerify(Context context , SHARE_MEDIA platform , UMAuthListener listener)接口來實現登錄。一句話概括就是 : 自定義一個實現了Loginable接口的類,在這個類的各個函數中調用你原有的登錄、登出、判斷是否已登錄的函數來實現對應的功能。實現了登錄類之後,通過LoginSDKManager的addImpl(String key, Loginable impl)來將該實現注入到友盟微社區SDK中,最後通過LoginSDKManager的useThis(String key)函數來指定要使用的登錄實現,這個key就是addImpl(String key, Loginable impl)中設置的key。

自定義登錄類示例代碼如下 :

/**
 * 友盟社會化組件的登錄實現,這裡可以替換成自己的賬戶系統、第三方登錄等,實現幾個接口函數即可。
 */
public class SocialLoginImpl implements Loginable {

    @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, new SocialLoginImpl());
// 指定使用的具體實現
loginMgr.useThis(clzKey);

為了更簡單,這個過程被我們封裝到一個函數中,使用的代碼最後簡化為 :

// 一行代碼搞定!這個函數封裝了上述所有的代碼。
LoginSDKManager.getInstance().addAndUse(new SocialLoginImpl()) ;

通過這幾步,登錄系統就注入到微社區SDK中了。當友盟微社區需要登錄時,微社區SDK就會通過LoginSDKManager的getCurrentImpl()函數獲取用戶指定的登錄實現,然後觸發對應的login()函數,此時就會執行你的登錄流程。登錄成功之後,通過login()函數的回調listener ( 這個簡單示例中沒有給出該listener, 具體可參考 友盟微社區使用已有賬戶系統 ) 將用戶信息傳回給友盟SDK,就完成了整個登錄過程。

雜談

目前友盟微社區SDK還處在內測階段 ( 友盟微社區內測申請地址,不過已經可以投入使用。已經有一部分集成了友盟微社區的App上線,並且運行良好。希望本文能有開發第三方Android SDK的同學一些幫助,讓開發中的坑更少一些。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved