android分享数据到不同平台组件化
ruchen
9年前
来自: http://blog.csdn.net//lcq5211314123/article/details/50221999
快两个月没写博客了,真是惭愧,一个好习惯想要一直坚持下去真的不是一件容易的事情,赶快回到正轨,把自己的一点点经验总结出来,继续写下去。 最近项目要用到分享的功能,这几乎是每一个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,或是友盟,还是我们自己去写的平台分享代码。
最后,本文主要是讲如何封装一个与业务无关的可利用的分享组件,具体对平台本身的问题还是到官网去查看文档。