本篇文章具體對該社會化SDK進行了源碼解析。增長你們對該SDK設計的理解,方便你們本身fork,持續集成開發。java
具體代碼項目Github地址:github.com/tsy12321/So…git
系列一 Android SDK的二次封裝和使用
系列二 源碼解析
系列三 微信SDK接入
系列四 QQ SDK接入
系列五 新浪微博 SDK接入github
整個SDK的設計都是基於抽象接口的實現,好比不一樣的平臺都基於SSOHandler,不一樣的分享媒介都基於IShareMedia,全部config信息保存在靜態Map中。api
SDK封裝的方式是自己的實現代碼封裝單獨的sdk,裏面實現各個平臺的登陸分享實現代碼,須要哪一個平臺直接搭配那個平臺的SDK便可使用。(後面若是代碼變多能夠考慮將抽象的封裝單獨SDK,不一樣平臺的實現也封裝一個,這樣搭配平臺就能夠是:自己SocialSDK+平臺SDK+平臺實現SDK)微信
全部配置信息保存在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;
}複製代碼
全部平臺都會繼承抽象類SSOHandler,抽象類中有authorize、share等接口,在各自平臺實現的Handler中根據不一樣平臺接入文檔不一樣各自實現。統一結果回調AuthListerner或者ShareListener。post
類圖以下:測試
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代碼即須要根據不一樣文檔去實現。
如今分享支持文字分享、圖片分享、音樂分享、視頻分享、網頁分享。
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 ;
}
...複製代碼
因爲不一樣平臺的回調方式不一樣,好比微信是必須實現wxapi.WXEntryActivity 在這個activity實現回調。QQ是在onActivityResult中實現結果回調。其實原理同樣。
在回調入口處重寫(WXEntryActivity)或者調用(onActivityResult),而後將回調處理放到不一樣平臺的Handler中處理,最後調用初始傳入的AuthListener或者ShareListener回調結果。
總體的實現很簡單,這樣的設計也更加容易擴展多個平臺。本篇就醬紫了,下篇會介紹不一樣平臺的接入實現和注意點。