社會化登陸分享-源碼解析

本篇文章具體對該社會化SDK進行了源碼解析。增長你們對該SDK設計的理解,方便你們本身fork,持續集成開發。java

具體代碼項目Github地址:github.com/tsy12321/So…git

0 系列文章

系列一 Android SDK的二次封裝和使用
系列二 源碼解析
系列三 微信SDK接入
系列四 QQ SDK接入
系列五 新浪微博 SDK接入github

1 前言

整個SDK的設計都是基於抽象接口的實現,好比不一樣的平臺都基於SSOHandler,不一樣的分享媒介都基於IShareMedia,全部config信息保存在靜態Map中。api

SDK封裝的方式是自己的實現代碼封裝單獨的sdk,裏面實現各個平臺的登陸分享實現代碼,須要哪一個平臺直接搭配那個平臺的SDK便可使用。(後面若是代碼變多能夠考慮將抽象的封裝單獨SDK,不一樣平臺的實現也封裝一個,這樣搭配平臺就能夠是:自己SocialSDK+平臺SDK+平臺實現SDK)微信

2 不一樣平臺配置信息的保存

全部配置信息保存在PlatformConfig.configs中,是一個靜態Mapapp

public class PlatformConfig {

    public static Map<PlatformType, PlatformConfig.Platform> configs = new HashMap();

    static {
        configs.put(PlatformType.WEIXIN, new PlatformConfig.Weixin(PlatformType.WEIXIN));
        configs.put(PlatformType.WEIXIN_CIRCLE, new PlatformConfig.Weixin(PlatformType.WEIXIN_CIRCLE));
    }
    ...
}複製代碼

而後在項目入口(Application或者入口Activity)要求使用者初始化配置信息。ide

PlatformConfig.setWeixin(WX_APPID, WX_APPSECRET);複製代碼

裏面具體實現便是將配置信息保存在不一樣的config裏。不一樣平臺的config都實現PlatformConfig.Platform接口,而後在本身裏面根據配置信息不一樣保存不一樣信息。函數

public interface Platform {
        PlatformType getName();
        boolean isConfigured();
    }

    //微信
    public static class Weixin implements PlatformConfig.Platform {
        private final PlatformType media;
        public String appId = null;
        public String appSecret = null;

        public PlatformType getName() {
            return this.media;
        }

        public Weixin(PlatformType var1) {
            this.media = var1;
        }

        public boolean isConfigured() {
            return !TextUtils.isEmpty(this.appId) && !TextUtils.isEmpty(this.appSecret);
        }
    }

    /** * 設置微信配置信息 * @param appId * @param appSecret */
    public static void setWeixin(String appId, String appSecret) {
        PlatformConfig.Weixin weixin = (PlatformConfig.Weixin)configs.get(PlatformType.WEIXIN);
        weixin.appId = appId;
        weixin.appSecret = appSecret;

        //微信朋友圈也用相同的配置信息
        PlatformConfig.Weixin weixin_circle = (PlatformConfig.Weixin)configs.get(PlatformType.WEIXIN_CIRCLE);
        weixin_circle.appId = appId;
        weixin_circle.appSecret = appSecret;
    }複製代碼

3 不一樣平臺登陸、分享的實現

全部平臺都會繼承抽象類SSOHandler,抽象類中有authorize、share等接口,在各自平臺實現的Handler中根據不一樣平臺接入文檔不一樣各自實現。統一結果回調AuthListerner或者ShareListener。post

類圖以下:測試

SSOHandler類圖
SSOHandler類圖

SSOHandler代碼:

public abstract class SSOHandler {

    /** * 初始化 * @param context * @param config 配置信息 */
    public void onCreate(Context context, PlatformConfig.Platform config) {

    }

    /** * 登陸受權 * @param authListener 受權回調 */
    public void authorize(AuthListener authListener) {

    }

    /** * 分享 * @param shareMedia 分享內容 * @param shareListener 分享回調 */
    public void share(IShareMedia shareMedia, ShareListener shareListener) {

    }

    /** * 是否安裝 * @return */
    public boolean isInstall() {
        return true;
    }
}複製代碼

各自的平臺Handler代碼即須要根據不一樣文檔去實現。

4 多種分享媒介的實現

如今分享支持文字分享、圖片分享、音樂分享、視頻分享、網頁分享。

5個分享都會實現一個實體類,裏面定義各個媒介須要的元素。好比文字分享須要分享文本,音樂分享須要音樂的地址、分享內容、縮略圖等。

類圖以下:

分享媒介類圖
分享媒介類圖

調用分享接口時根據須要分享的媒介各自實體化媒介類。

//分享媒介 後面有詳細介紹
ShareWebMedia shareMedia = new ShareWebMedia();
shareMedia.setTitle("分享網頁測試");
shareMedia.setDescription("分享網頁測試");
shareMedia.setWebPageUrl("http://www.baidu.com");
shareMedia.setThumb(BitmapUtils.readBitMap(getApplicationContext(), R.mipmap.ic_launcher));複製代碼

而後傳入分享接口:

/** * 分享 * @param shareMedia 分享內容 * @param shareListener 分享回調 */
    public void share(IShareMedia shareMedia, ShareListener shareListener) {

    }複製代碼

在具體實現的share函數中判斷media具體是哪一個,而後調用相應平臺的分享sdk

@Override
    public void share(IShareMedia shareMedia, ShareListener shareListener) {


        if(shareMedia instanceof ShareWebMedia) {       //網頁分享
            ...
        } else if(shareMedia instanceof ShareTextMedia) {   //文字分享
            ...
        } else if(shareMedia instanceof ShareImageMedia) {  //圖片分享
            ...
        } else if(shareMedia instanceof ShareMusicMedia) {  //音樂分享
            ...
        } else if(shareMedia instanceof ShareVideoMedia) {      //視頻分享
            ...
        } else {
            if(this.mShareListener != null) {
                this.mShareListener.onError(this.mConfig.getName(), "shareMedia error");
            }
            return ;
        }

       ...複製代碼

5 結果回調通知

因爲不一樣平臺的回調方式不一樣,好比微信是必須實現wxapi.WXEntryActivity 在這個activity實現回調。QQ是在onActivityResult中實現結果回調。其實原理同樣。

在回調入口處重寫(WXEntryActivity)或者調用(onActivityResult),而後將回調處理放到不一樣平臺的Handler中處理,最後調用初始傳入的AuthListener或者ShareListener回調結果。

結尾

總體的實現很簡單,這樣的設計也更加容易擴展多個平臺。本篇就醬紫了,下篇會介紹不一樣平臺的接入實現和注意點。

相關文章
相關標籤/搜索