安卓分享功能(造轮子)

本文介绍了作者自制的安卓分享SDK,旨在替代第三方分享库sharesdk,实现对微信、QQ、微博的集成。文章详细讲解了代码设计、分享逻辑、各层架构以及如何在项目中使用该SDK。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍:

项目地址: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 层次:

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() {
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值