ChinaShare三方库的分析

ChinaShare分享库

ChinaShare是一个将分享相关功能模块化的一个库。这个库已经有几年没有更新了,所以不建议使用这个库,分析这个库主要是为了学习设计库的思想以及方法。
这个库的设计思路比较简单,先看一下大致的流程图

流程图.png


首先需要在Application中初始化ShareManager,ShareManager的初始化过程中需要配置所要分享的App的Id以及一些默认的配置。
整个库的核心实际上是ShareView,ShareView不仅仅需要实现分享View的效果,还要实现一些分享逻辑,比如通过ShareManager获取需要分享的平台以及获取到点击位置的平台并调用相应平台的OnShare方法。对于需要指定样式的ShareView的需求来说,使用这个库就会比较麻烦。

  • IShareWay
    这个接口定义了两个方法,一个是onShare方法,通过具体的平台实现类去实现。一个是onActivtyResult方法。因为一些平台的分享会回调Activity,所以需要在这个方法中实现一些操作。
public class QQShareImpl extends BaseShareWay {
...
 @Override
    public void onShare(IShareInfo mInfo) {
        switch (mShareWay) {
            case SHARE_QQ:
                shareToQQ(mInfo.getShareTitle(), mInfo.getShareContent(), mInfo.getShareUrl(), mInfo.getShareImgUrl());
                break;
            case SHARE_Qzeon:
                shareToQzeon(mInfo.getShareTitle(), mInfo.getShareContent(), mInfo.getShareUrl(), mInfo.getShareImgUrl());
                break;
        }
    }

    public void shareToQQ(String title, String content, String shareUrl,
                          String imgUrl) {

        final Bundle params = new Bundle();
        params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE,
                QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
        params.putString(QQShare.SHARE_TO_QQ_TITLE, title);
        params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, shareUrl);
        params.putString(QQShare.SHARE_TO_QQ_SUMMARY, content);
        params.putString(QQShare.SHARE_TO_QQ_APP_NAME, ShareManager.getAppName());
        if (!TextUtils.isEmpty(imgUrl)) {
            params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, imgUrl);
        } else {
            if(!TextUtils.isEmpty( ShareManager.getDefShareImageUrl())){
                params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, ShareManager.getDefShareImageUrl());
            }
        }

        mTencent.shareToQQ(mActivity, params, new IUiListener() {
            @Override
            public void onError(UiError arg0) {
                String message = mActivity.getString(R.string.share_fail) + " " + arg0.errorMessage;
                Toast.makeText(mActivity, message , Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onComplete(Object arg0) {
            }

            @Override
            public void onCancel() {

            }
        });
    }
    ...
}
  • IShareInfo以及IWarpTemplateShare
    这两个接口在库中都提供了默认的实现类,IShareInfo的实现类是为了给ShareView设置标题图标等信息。IWarpTemplateShare接口是要分享得信息的包装模板,任何要分享的信息都要实现这个模板接口。
  • AbsWarpTemplateShare
    是一个实现了IWarpTemplateShare接口的抽象类,他会包装源信息的实体,并将源信息和分享时显示的内容做关联。
  • ShareManager
    通过分享的Type将所有平台的信息汇总,关联到具体的平台实现类中,在ShareView中通过ShareManager中geShareWay()得到具体的平台实现类List,并根据点击的图标的位置调用具体的平台实现类中的方法来实现分享。
 public static List<BaseShareWay> getShareWay(Activity activity) {
        List<BaseShareWay> list = new ArrayList<>();
        //如果不设置分享的icon 则使用默认样式的分享图标
        if (getShareWayIconMap().isEmpty()) {
            for (SHARE_MEDIA item : Setting.getInstance().getShareMedia()) {
                switch (item) {
                    case WEICHAT:
                        list.add(new WeichatShareImpl(activity, R.drawable.share_weixin, activity.getString(R.string.title_share_weixin), WeichatShareImpl.SHARE_WEICHAT));
                        break;
                    case WEICHATCIRCLE:
                        list.add(new WeichatShareImpl(activity, R.drawable.share_momment, activity.getString(R.string.title_share_momment), WeichatShareImpl.SHARE_MOMMENT));
                        break;
                    case SINA:
                        list.add(new SinaShareImpl(activity, R.drawable.share_sina, activity.getString(R.string.title_share_sina)));
                        break;
                    case QQ:
                        list.add(new QQShareImpl(activity, R.drawable.share_qq, activity.getString(R.string.title_share_qq), QQShareImpl.SHARE_QQ));
                        break;
                    case QQZONE:
                        list.add(new QQShareImpl(activity, R.drawable.share_qzeon, activity.getString(R.string.title_share_qzeon), QQShareImpl.SHARE_Qzeon));
                        break;
                    case MESSAGE:
                        list.add(new MessageShareImpl(activity, R.drawable.share_message, activity.getString(R.string.title_share_message)));
                        break;
                    default:
                        break;
                }
            }
        }
  • ShareView
    获取到IShareInfo的List以及ShareManager中平台的List。通过调用具体平台的onShare方法并传入ShareInfo来实现分享操作。
    public void setShareInfo(final Activity activity, AbsWarpTemplateShare shareInfo) {
        final List<IShareInfo> listInfo = shareInfo.getListInfo();
        final List<BaseShareWay> list = ShareManager.getShareWay(activity);
        mGirdView.setAdapter(new ShareAdapter(activity, list));
        mGirdView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                share = list.get(position);
                share.onShare(listInfo.get(position));
            }
        });
        initHeight();

    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容