ChinaShare分享库
ChinaShare是一个将分享相关功能模块化的一个库。这个库已经有几年没有更新了,所以不建议使用这个库,分析这个库主要是为了学习设计库的思想以及方法。
这个库的设计思路比较简单,先看一下大致的流程图
首先需要在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();
}
网友评论