介绍:
项目地址:https://github.com/woaigmz/OneKeyShare
组件化项目的sharelib,欢迎大家fork star 甚至 follow 感谢:)
demo - gif图
造个轮子吧,用自己的心里踏实:
项目集成微信、QQ、微博。很烦,并不想用三方的一键分享。不如自己写个 sdk 吧,以后逻辑都要自己控制 :)
代码设计:
1:单一职责原则 (Single Responsibility Principle, SRP) 一个类只负责一个功能领域中的相应职责
2:开闭原则 (Open-Closed Principle, OCP) 软件实体应对扩展开放,而对修改关闭
3:里氏代换原则 (Liskov Substitution Principle, LSP) 所有引用基类对象的地方能够透明地使用其子类的对象
4:依赖倒转原则 (Dependence Inversion Principle, DIP) 抽象不应该依赖于细节,细节应该依赖于抽象
5:接口隔离原则 (Interface Segregation Principle, ISP) 使用多个专门的接口,而不使用单一的总接口
6:合成复用原则 (Composite Reuse Principle, CRP) 尽量使用对象组合,而不是继承来达到复用的目的
7:迪米特法则 (Law of Demeter, LoD) 一个软件实体应当尽可能少地与其他实体发生相互作用
我的 share-sdk 层次:
分析:
view层:
dialog(一般情况下的分享弹窗),
ShareActivity(隔离层,中间件,分离组合三种分享回调)
model层:
AppId(三个平台注册的appid,实现了Serializable)
ShareBean(存放分享内容,实现了Parcelable)
presenter层:
通过分享类型,分享model的数据,来调起 view(ShareActivity) 进而调起 SDK (QQShare/WXShare/SineShare)
proxy:
提供sdk入口:初始化appid,创建分享dialog,设置点击监听 ,其他功能可根据情况扩展
其他:
util:缩略图的异步加载优化并进行dislrucache,序列化id等工具
@IntDef注解:性能优于class和枚举,将分享渠道和状态从代码里分离,解耦
share:将分享功能sdk处理调用放在这里
ShareListener:将三种sdk回调在ShareActivity处理
wxapi/WXEntryActivity:通过WXShare.sendBroadcast(this, resp.errCode)将分享的回调发送广播传递给WXShare的广播接收者,收到回调结果传给ShareListener(WXShare的WXShareReceiver注册在ShareActivity里)
使用:
1: Application 里
(这些id先用美团的吧,注意替换自己的)
ShareSdkProxy.getInstance().init(this,new String[]{"214506","wxa552e31d6839de85","1550938859"});
2: 自己的 Fragment 或 Acitvity 里
创建 分享视图
//创建 dialog
IShareView shareDialog = ShareSdkProxy.getInstance().createShareDialog(new int[]{ShareChannel.CHANNEL_QQ, ShareChannel.CHANNEL_WEIBO, ShareChannel.CHANNEL_WECHAT_MOMENT, ShareChannel.CHANNEL_QQ_ZONE}, 4);
// 设置点击回调和数据
ShareSdkProxy.getInstance().setOnShareClickListener(shareDialog, getActivity(), new ShareBean("分享了", "今天天气不错", "http://118.89.233.211:3000/images/1530106897838_.jpg", R.drawable.ic_launcher, "http://www.baidu.com"));
//展示 dialog
shareDialog.show(getFragmentManager());
3: 自己的 Fragment 或 Acitvity 里
接收回调结果
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
int status = data.getIntExtra(ShareActivity.RESULT_STATUS, -1);
switch (status) {
case ShareStatus.SHARE_STATUS_COMPLETE:
ToastUtil.showShortToast("分享成功");
break;
case ShareStatus.SHARE_STATUS_ERROR:
ToastUtil.showShortToast("分享失败");
break;
case ShareStatus.SHARE_STATUS_CANCEL:
ToastUtil.showShortToast("取消分享");
break;
}
}
}
详情:
1:入口ShareSdkProxy
public class ShareSdkProxy implements IShareSdkProxy {
private ShareSdkProxy() {
}
public interface OnShareClickListener {
void onShareClick(@ShareChannel int channel);
}
private static class Holder {
private static final ShareSdkProxy IN = new ShareSdkProxy();
}
public static ShareSdkProxy getInstance() {
return Holder.IN;
}
@Override
public void init(Application app, String[] appIds) {
if (app != null && appIds != null && appIds.length == 3) {
try {
SerializeUtils.serialization(getSerializePath(app), new AppId(appIds[0], appIds[1], appIds[2]));
} catch (Exception e) {
throw new RuntimeException(" ShareSdk serialized error: " + e);
}
} else {
throw new RuntimeException(" ShareSdk init error ");
}
}
/**
* the channel turn can inflect the turn of IShareView( in this is a dialog )
*
* @param shareChannel the type of share function
* @param column the column of dialog
* @return the instance of dialog
* @link ShareChannel.java
*/
@Override
public IShareView createShareDialog(int[] shareChannel, int column) {
return ShareDialog.get().createShareDialog(shareChannel, column);
}
/**
* @param dialog dialog
* @param activity the current activity to accept the result of the share sdk
* @param shareBean the model of share function
*/
@Override
public void setOnShareClickListener(IShareView dialog, final Activity activity, final ShareBean shareBean) {
dialog.setOnShareClickListener(new OnShareClickListener() {