1. 程式人生 > >Android信鴿推送全解

Android信鴿推送全解

Android開發中整合信鴿推送還是比較簡單的,但是遇到了坑就麻煩

先介紹一下整合信鴿推送的步驟

1.build檔案中新增依賴

    //信鴿的版本
    compile 'com.tencent.xinge:xinge:3.1.1-alpha'
    //mid包的版本
    compile 'com.tencent.mid:mid:3.721-alpha'

2.新增自定義廣播MessageReceiver接收推送訊息

        <!-- APP實現的Receiver,用於接收訊息和結果反饋 -->
        <!-- com.tencent.android.xgpushdemo.CustomPushReceiver需要改為自己的Receiver -->
<receiver android:name=".third.push.MessageReceiver" android:exported="true" > <intent-filter> <!-- 接收訊息透傳 --> <action android:name="com.tencent.android.tpush.action.PUSH_MESSAGE" /> <!-- 監聽註冊、反註冊、設定/刪除標籤、通知被點選等處理結果 -->
<action android:name="com.tencent.android.tpush.action.FEEDBACK" /> </intent-filter> </receiver>

3.在MessageReceiver中收到通知後的操作


    // 收到通知後的操作,
    @Override
    public void onNotifactionShowedResult(Context context, XGPushShowedResult notifiShowedRlt) {
        if
(context == null || notifiShowedRlt == null) { return; } LogUtils.i("--------messageReciver----result---------------" + notifiShowedRlt); PreferenceUtil pUtil = PreferenceUtil.getInstance(); context.sendBroadcast(reciverIntent); int countMention = pUtil.getNoReadMsg(); countMention++; pUtil.setNoReadMsg(countMention); String strJSON = notifiShowedRlt.getCustomContent(); JSONObject object = JSON.parseObject(strJSON); int type = object.getIntValue("category"); switch (type) { case MessageBean.MSG_TYPE_SHIELD: //遮蔽使用者,需要退出登入 break; case MessageBean.MSG_TYPE_BLACK_YELLOW_LIST: //黃黑名單使用者 break; case MessageBean.MSG_TYPE_BANNED_SAY: //禁言使用者 break; case MessageBean.MSG_UPDATE_KEY: //更改金鑰 break; } //重新整理一下未讀訊息 OtherRequest.getInstance().getUnReadLog(pUtil, pUtil.getUserToken()); }

4.點選通知欄進入不同詳情:


    /**
     * 點選不同型別通知,進入不同詳情
     *
     * @param context
     * @param message
     */
    @Override
    public void onNotifactionClickedResult(Context context, XGPushClickedResult message) {
        if (context == null || message == null) {
            return;
        }

        LogUtils.i("--------onNotifactionClickedResult----result---------------" + message);

        String strJSON = message.getCustomContent();
        JSONObject object = JSON.parseObject(strJSON);
        int type = object.getIntValue("category");
        int bsnId = object.getIntValue("bsnId");
        int extId = object.getIntValue("extId");
        switch (type) {

            case MessageBean.MSG_TYPE_LOTTERY:
                GetLotteryActivity.enterActivity(context, bsnId, extId);
                break;

            case MessageBean.MSG_TYPE_SYSTEM:
            case MessageBean.MSG_TYPE_SHIELD:
            case MessageBean.MSG_TYPE_BLACK_YELLOW_LIST:
            case MessageBean.MSG_TYPE_BANNED_SAY:
                Intent intentMsg = new Intent(context, MessageActivity.class);
                context.startActivity(intentMsg);
                break;
            case MessageBean.MSG_DRAW_NOTIFY:
                Intent drawIntent = new Intent(context, UserDrawLogActivity.class);
                context.startActivity(drawIntent);
                break;

        }
    }

第五步,信鴿推送的註冊與反註冊


   //註冊信鴿推送,繫結推送賬號
        XGPushManager.registerPush(mActivity.getApplicationContext(), String.valueOf(userId));

//註冊信鴿推送,解綁推送賬號
        XGPushManager.unregisterPush(activity.getApplicationContext());

這樣信鴿推送基本整合完畢,接下來開始踩坑了.

一坑:收不到推送的訊息

自己在信鴿官方平臺發一條推送訊息給自己,看是否能收到:

1.如果能收到,直接摔鍋給後臺
2.如果不能收到,
1. 檢查自己的token是否配置正確
2. 檢查自己是否有註冊

二坑:點選通知欄通知後,進入自己指定的介面後,又重新打開了App

自己在信鴿官方平臺高階設定裡面的DeepLink 指定自己要開啟的Activity,發一條推送訊息給自己,看是否能正常開啟:

1.如果能收到且正常開啟,直接摔鍋給後臺
2.如果不能收到,告訴後臺:

    1. 後臺是否有指定正確的Activity.
    2. 後臺如果不指定Activity,則會啟動App,沒有進入我們指定的activity
    3. 後臺不需要指定包名。

三坑:點選通知欄通知後,進入自己指定的介面後,再按返回,發現回到自己指定的Activity中

我指定一個推送介面MessageActivity,點選通知欄,進入了新的指定介面OrderActivity,我再返回的時候,他進入了我指定的推送介面MessageActivity,其實這個時候完全不需要進入這個MessageActivity,我諮詢了信鴿官方,他們說確實存在這樣的bug.於是我自己整理了一個解決方案.

  /**
     * 點選不同型別通知,進入不能詳情
     *
     * @param context
     * @param message
     */
    @Override
    public void onNotifactionClickedResult(Context context, XGPushClickedResult message) {
        if (context == null || message == null) {
            return;
        }

        LogUtils.i("--------onNotifactionClickedResult----result---------------" + message);

        String strJSON = message.getCustomContent();
        String activityName = message.getActivityName();    //注意這裡的ActivityName是一個全路徑的

這裡可以獲取到activityName,我們只需要把這個指定的activityName**(我這裡是MessageActivity)**對應的activity關掉就可以了。
但這裡要注意關掉的時機,會發現只有在執行跳入新介面(OrderActivity)的時候才會開啟那個MessageActivity. 所以我們可以在開啟OrderActivity後手動關掉MessageActivity.這樣就避免了一個多餘的介面,且也不會對使用者造成影響.




    /***
     * 功能:結束指定activity名稱
     * 建立時間: 2017/7/28 15:15
     * @param
     ***/
    public void finishActivityclass(String activityName) {
        if (activities != null) {
            for (Activity activity : activities) {
                StringBuilder sb = new StringBuilder();
                sb.append(activity.getPackageName()).append(".").append(activity.getLocalClassName());
                if (sb.toString().equals(activityName)) {
                    this.activities.remove(activity);
                    finishActivity(activity);
                    break;
                }
            }
        }
    }



    /***
     * 功能:這裡是關閉信鴿推送指定的Activity,存在的一個bug,這是一個通用的方法,
     * 建立時間: 2017/7/28 15:01
     * @param
     ***/
    public static void closePushActivity(Intent intent) {
        String activityName = intent.getStringExtra(KEY_OPEN_ACTIVITY);
        if (!TextUtils.isEmpty(activityName)) {
            ActivityManagerUtils.getInstance().finishActivityclass(activityName);
        }
    }