android分享數據到不同平臺組件化

ruchen 10年前發布 | 10K 次閱讀 Android開發 移動開發

來自: 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());

}

}</pre>

總結:
應用層代碼隨便寫的,沒有進行代碼優化。這樣即使我們不想使用ShareSDK了,也可以自己去實現不同平臺的分享邏輯,替換到Manager 類中即可。可擴展性也非常的好,而應用層則完全不需要知道底層到底是使用的ShareSDK,或是友盟,還是我們自己去寫的平臺分享代碼。
最后,本文主要是講如何封裝一個與業務無關的可利用的分享組件,具體對平臺本身的問題還是到官網去查看文檔。

Demo下載地址: https://github.com/qndroid/ShareSDKDemo.git

</div>

 本文由用戶 ruchen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!