android分享数据到不同平台组件化

原创 2015年12月08日 17:45:56
快两个月没写博客了,真是惭愧,一个好习惯想要一直坚持下去真的不是一件容易的事情,赶快回到正轨,把自己的一点点经验总结出来,继续写下去。
最近项目要用到分享的功能,这几乎是每一个app都有的功能,分享一些链接和一些其它信息到各大平台以扩大自己应用的知名度。而有许多公司在专门做分享平台包括:友盟和ShareSDK等,使用这些平台去分享只需调用第三方分享平台的统一API而不必再分别处理不同平台的不同接口了,在此我使用了ShareSDK这个第三方的平台。
ShareSDK平台的分享API已经封装的非常的简单了,基本可以做到十几行代码就可实现指定平台的分享。但考虑到代码的复用性,自己对ShareSDK的底层API进行再次的封装,与业务逻辑彻底隔离,这样就可以达到复用了。
思路:1.每个不同的平台实现自己平台独有的分享逻辑。
     2.创建一个Manager类去管理所有的平台。
     3.应用层调用Manager的分享入口方法即可,具体的分享功能由Manager类分发到不同的分享平台去即可。
实现了这三步以后,应用层就与具体的分享完全隔离开来,以后再有分享功能则直接copy步骤1和2创建好的类即可。
下面看基于ShareSDK的封装代码如下:
由于我们使用了ShareSDK,针对不同的平台的不同的分享逻辑则暂且不用我们去实现了,ShareSDK平台已经为我们封装好了,第二步,则是我们自己的Manager平台去管理各个不同的分享平台。代码如下:
package customshare;

/**
 * @author rzq
 * @function 分享功能统一入口,负责发送数据到指定平台
 */
public class ShareManager {

    /**
     * 应用程序上下文
     */
    private Context mContext;
    private Platform mCurrentPlatform;

    /**
     * 第一个执行的方法
     * 
     * @param context
     */
    public static void initSDK(Context context) {

        ShareSDK.initSDK(context);
    }

    /**
     * 分享数据到不同平台
     */
    public void shareData(ShareData shareData, PlatformActionListener listener) {

        switch (shareData.mPlatformType) {
        case QQ:
            mCurrentPlatform = ShareSDK.getPlatform(QQ.NAME);
            break;
        case QZone:
            mCurrentPlatform = ShareSDK.getPlatform(QZone.NAME);
            break;
        case WeChat:
            mCurrentPlatform = ShareSDK.getPlatform(Wechat.NAME);
            break;
        case WechatMoments:
            mCurrentPlatform = ShareSDK.getPlatform(WechatMoments.NAME);
            break;
        case WechatFavorite:
            mCurrentPlatform = ShareSDK.getPlatform(WechatFavorite.NAME);
            break;
        case SMS:
            mCurrentPlatform = ShareSDK.getPlatform(ShortMessage.NAME);
            break;
        case Email:
            mCurrentPlatform = ShareSDK.getPlatform(Email.NAME);
            break;
        case TencentWeibo:
            mCurrentPlatform = ShareSDK.getPlatform(TencentWeibo.NAME);
            break;
        default:
            break;
        }
        mCurrentPlatform.setPlatformActionListener(listener);
        mCurrentPlatform.share(shareData.mShareParams);
    }

    /**
     * 第三方用户登陆应用统一入口,
     * 
     * @param type
     *            第三方类型
     * @param listener
     *            事件回调处理
     */
    public void loginEntry(PlatofrmType type, PlatformActionListener listener) {
        switch (type) {
        case QQ:
        case QZone:
            mCurrentPlatform = ShareSDK.getPlatform(QQ.NAME);
            break;
        default:
            break;
        }

        mCurrentPlatform.SSOSetting(false);
        mCurrentPlatform.showUser(null); // 请求用户信息
    }

    /**
     * @author 应用程序需要的平台
     */
    public enum PlatofrmType {

        QQ, QZone, TencentWeibo, WeChat, WechatFavorite, WechatMoments, SMS, Email;
    }
}

第三步,编写应用层代码,应用层只能与我们的分享Manager类去交互。

package com.rzqshare;

public class MainActivity extends Activity implements OnClickListener, PlatformActionListener
{
    private Button mQQButton;
    private Button mQZoneButton;
    private Button mWeChatFriend;
    private Button mSmsView;
    private Button mEmailView;
    private Button mTecentWeiBoView;

    private ShareManager shareManager;
    private ShareData mData;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView()
    {
        mQQButton = (Button) findViewById(R.id.qq_view);
        mQZoneButton = (Button) findViewById(R.id.qzone_view);
        mWeChatFriend = (Button) findViewById(R.id.wechat_view);
        mSmsView = (Button) findViewById(R.id.sms_view);
        mEmailView = (Button) findViewById(R.id.email_view);
        mTecentWeiBoView = (Button) findViewById(R.id.tecent_weibo_view);

        mQQButton.setOnClickListener(this);
        mQZoneButton.setOnClickListener(this);
        mWeChatFriend.setOnClickListener(this);
        mSmsView.setOnClickListener(this);
        mEmailView.setOnClickListener(this);
        mTecentWeiBoView.setOnClickListener(this);

        shareManager = new ShareManager();

    }

    @Override
    public void onClick(View v)
    {
        mData = new ShareData();
        switch (v.getId())
        {
        case R.id.qq_view:
            ShareParams params = new ShareParams();
            params.setText("QQ文本");
            mData.mPlatformType = PlatofrmType.QQ;
            mData.mShareParams = params;
            break;
        case R.id.qzone_view:
            ShareParams params2 = new ShareParams();
            params2.setText(getString(R.string.app));
            params2.setTitle("测试分享的标题");
            // params2.setTitleUrl("www.sharesdk.cn");
            params2.setTitleUrl(getString(R.string.baidu));
            mData.mPlatformType = PlatofrmType.QZone;
            mData.mShareParams = params2;
            break;
        case R.id.wechat_view:
            ShareParams params3 = new ShareParams();
            params3.setShareType(Platform.SHARE_IMAGE);
            params3.setTitle("朋友圈文本");
            params3.setImagePath(Environment.getExternalStorageDirectory() + "/1.jpg");
            mData.mPlatformType = PlatofrmType.WechatFavorite;
            mData.mShareParams = params3;
            break;
        case R.id.email_view:
            ShareParams params5 = new ShareParams();
            // params4.setShareType(Platform.SHARE_IMAGE);
            params5.setAddress("277451977@qq.com");
            params5.setTitle("邮件文本");
            params5.setText("我要分享的内容。");
            params5.setImagePath(Environment.getExternalStorageDirectory() + "/1.jpg");
            mData.mPlatformType = PlatofrmType.Email;
            mData.mShareParams = params5;
            break;
        case R.id.sms_view:
            ShareParams params4 = new ShareParams();
            // params4.setShareType(Platform.SHARE_IMAGE);
            params4.setAddress("18911230100");
            params4.setTitle("短信文本");
            params4.setText("我要分享的内容。");
            params4.setImagePath(Environment.getExternalStorageDirectory() + "/1.jpg");
            mData.mPlatformType = PlatofrmType.SMS;
            mData.mShareParams = params4;
            break;
        case R.id.tecent_weibo_view:
            ShareParams params51 = new ShareParams();
            // params4.setShareType(Platform.SHARE_IMAGE);
            // params51.setAddress("18911230100");
            // params51.setTitle("短信文本");
            params51.setText("我要分享的内容。");
            params51.setImagePath(Environment.getExternalStorageDirectory() + "/1.jpg");
            mData.mPlatformType = PlatofrmType.TencentWeibo;
            mData.mShareParams = params51;
            break;
        }
        /**
         * 需要一个对话框阻止用户多次操作,因为此处可能是一个异步状态
         */
        shareManager.shareData(mData, this);
    }

    @Override
    public void onCancel(Platform arg0, int arg1)
    {
        Log.e("------------->", "cancel");
    }

    @Override
    public void onComplete(Platform arg0, int arg1, HashMap<String, Object> arg2)
    {
        Log.e("------------->", arg0.getName() + "arg1:" + arg1);
    }

    @Override
    public void onError(Platform arg0, int arg1, Throwable arg2)
    {
        Log.e("----->onError", arg2.getMessage());

    }

}

总结:
应用层代码随便写的,没有进行代码优化。这样即使我们不想使用ShareSDK了,也可以自己去实现不同平台的分享逻辑,替换到Manager 类中即可。可扩展性也非常的好,而应用层则完全不需要知道底层到底是使用的ShareSDK,或是友盟,还是我们自己去写的平台分享代码。
最后,本文主要是讲如何封装一个与业务无关的可利用的分享组件,具体对平台本身的问题还是到官网去查看文档。

欢迎大家关注我的微信公众号,每天会为大家推荐一篇好的技术文章,还有我的视频课程喔
Demo下载地址: https://github.com/qndroid/ShareSDKDemo.git

Android组件化方案

随着APP版本不断的迭代,新功能的不断增加,业务也会变的越来越复杂,APP业务模块的数量有可能还会继续增加,而且每个模块的代码也变的越来越多,这样发展下去单一工程下的APP架构势必会影响开发效率,增加...
  • guiying712
  • guiying712
  • 2017年02月15日 19:01
  • 28773

Android 开发:由模块化到组件化(一)

当你看到这的时候,想必心理一阵恶寒:模块化?组件化?到底是什么鬼?有啥区别. 有这种感觉才是对的,模块化和组件化本质思想是一样的,都是"大化小",两者的目的都是为了重用和解耦,只是叫法不一样.如果非要...
  • dd864140130
  • dd864140130
  • 2016年12月15日 01:43
  • 27102

Android架构之组件化方案

1、Android组件化项目 在Android项目组件化之前,我们的项目都是像下图那样,一个单一工程下,根据不同的业务分几个文件夹,把需要的第三方库依赖下就开始开发了,这样的代码耦合严重,牵一发而...
  • wangwangli6
  • wangwangli6
  • 2017年03月20日 10:08
  • 2324

谈android组件化之ARouter简单使用

本文主要讲解了android组件化下的ARouter基本使用方法
  • vv765947965
  • vv765947965
  • 2017年04月25日 16:30
  • 7331

Android组件化之终极方案

那么如果解决这些问题呢?我想大多数Android开发者都能想到这个办法。如果你把开源的三方库当做一个功能组件的话,那么很显然,我们在使用这些三方库的时候是通过什么方式呢?难道你会下载它的源代码吗,应该...
  • guiying712
  • guiying712
  • 2017年09月21日 21:27
  • 3984

Android 开发:由模块化到组件化(一)

模块化和组件化模块化组件化不是个新概念,其在各行各业都一直备受重视.至于组件化什么时候在软件工程领域提出已经无从考究了,不过呢可以确认的是组件化最早应用于服务端开发,后来在该思想的指导下,前端开发和移...
  • da_caoyuan
  • da_caoyuan
  • 2017年03月14日 09:25
  • 3942

Android 组件化开发

Android 组件化开发
  • zr7250109
  • zr7250109
  • 2016年12月26日 11:33
  • 634

Android组件化开发实践

Android项目中代码量达到一定程度,编译将是一件非常痛苦的事情,短则一两分钟,长则达到五六分钟。Android studio推出instant run由于各种缺陷一般情况下是被关闭的…… 组件化...
  • jiankeufo
  • jiankeufo
  • 2017年01月15日 18:54
  • 1116

Android 组件化

场景:公司业务扩大,业务拆分。团队已业务划分。就会遇到开发并行的问题。在中情况下可以使用业务组件化 技术:组件化的基本就是通过 gradle 脚本来做的 实现通过在需要组件化的业务 module 中:...
  • ch847808805
  • ch847808805
  • 2017年04月18日 17:54
  • 195

Android 业务组件化开发实践

【原文地址 点击打开链接】 原文链接:http://kymjs.com/code/2016/10/18/01 在 MDCC 中冯森林老师的《回归初心,从容器化到组件化》,为我们这些没有那么多精...
  • wenyiqingnianiii
  • wenyiqingnianiii
  • 2016年10月22日 13:22
  • 3800
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android分享数据到不同平台组件化
举报原因:
原因补充:

(最多只允许输入30个字)