Android 推送訊息的實現,使用百度雲推送

Main-zy發表於2014-08-17
專案中有可能會用到推送。如果自己寫一個的話,可是個耗時耗力的時,好在很多第三方公司都提供了推送服務,比如百度雲。我們可以在自己的程式中使用它。

百度雲推送

雲推送(Push)是百度開放雲向開發者提供的訊息推送服務;通過利用雲端與客戶端之間建立穩定、可靠的長連線來為開發者提供向客戶端應用推送實時訊息服務。

百度雲推送服務支援推送三種型別的訊息:通知、透傳訊息及富媒體;支援向所有使用者或根據標籤分類向特定使用者群體推送訊息;支援更多自定義功能(如自定義內容、後續行為、樣式模板等);提供使用者資訊及通知訊息統計資訊,方便開發者進行後續開發及運營。


雲推送服務具有以下特點:

1. 增強使用者粘性

通過雲和端之間建立的長連線,可以實時的推送訊息到達使用者端。保持與使用者的溝通,大大提升使用者活躍度和留存率。

2. 節約成本

在省電省流量方面遠超行業水平,基礎的訊息推送服務永久免費,大大節省開發者推送的成本。

3. 穩定安全的推送

強大的分散式叢集長期為百度各大產品線提供推送服務,保證訊息推送服務的穩定、可靠。

好吧,讓我們看看如何來使用它。

百度雲推送分兩部分:web端和手機端。

我們先看下手機端如何做。

1.註冊百度賬戶

2.加入 百度開發者

3.建立應用

4.下載sdk

5.匯入sdk包,開發應用

5.1 在AndroidManifest.xml 中註冊響應的receiver

5.2 在主窗體的oncreate中寫
PushManager.startWork(getApplicationContext(),
                PushConstants.LOGIN_TYPE_API_KEY, 
                PushServiceUtils.getMetaValue(this, "api_key"));



5.3 編寫自己的receiver。處理 繫結的相關訊息,推送的訊息,通知欄點選後的訊息

public class MyPushMessageReceiver extends BroadcastReceiver {

    private static final String TAG = "BroadcastReceiver";

    @Override
    public void onReceive(final Context context, Intent intent) {

        Log.d(TAG, ">>> Receive intent: \r\n" + intent);

        if (intent.getAction().equals(PushConstants.ACTION_MESSAGE)) {
            // 獲取訊息內容
            String message = intent.getExtras().getString(
                    PushConstants.EXTRA_PUSH_MESSAGE_STRING);

            // 訊息的使用者自定義內容讀取方式
            Log.i(TAG, "onMessage: " + message);

            // 自定義內容的json串
            Log.d(TAG,
                    "EXTRA_EXTRA = "
                            + intent.getStringExtra(PushConstants.EXTRA_EXTRA));

            // 使用者在此自定義處理訊息,以下程式碼為demo介面展示用
            Intent responseIntent = null;
            responseIntent = new Intent(PushServiceUtils.ACTION_MESSAGE);
            responseIntent.putExtra(PushServiceUtils.EXTRA_MESSAGE, message);
            responseIntent.setClass(context, MainActivity.class);
            responseIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(responseIntent);

        } else if (intent.getAction().equals(PushConstants.ACTION_RECEIVE)) {
            // 處理繫結等方法的返回資料
            // PushManager.startWork()的返回值通過PushConstants.METHOD_BIND得到

            // 獲取方法
            final String method = intent
                    .getStringExtra(PushConstants.EXTRA_METHOD);
            // 方法返回錯誤碼。若繫結返回錯誤(非0),則應用將不能正常接收訊息。
            // 繫結失敗的原因有多種,如網路原因,或access token過期。
            // 請不要在出錯時進行簡單的startWork呼叫,這有可能導致死迴圈。
            // 可以通過限制重試次數,或者在其他時機重新呼叫來解決。
            int errorCode = intent.getIntExtra(PushConstants.EXTRA_ERROR_CODE,
                    PushConstants.ERROR_SUCCESS);
            String content = "";
            if (intent.getByteArrayExtra(PushConstants.EXTRA_CONTENT) != null) {
                // 返回內容
                content = new String(
                        intent.getByteArrayExtra(PushConstants.EXTRA_CONTENT));
            }

            // 使用者在此自定義處理訊息,以下程式碼為demo介面展示用
            Log.d(TAG, "onMessage: method : " + method);
            Log.d(TAG, "onMessage: result : " + errorCode);
            Log.d(TAG, "onMessage: content : " + content);
            Toast.makeText(
                    context,
                    "method : " + method + "\n result: " + errorCode
                            + "\n content = " + content, Toast.LENGTH_SHORT)
                    .show();

            Intent responseIntent = null;
            responseIntent = new Intent(PushServiceUtils.ACTION_RESPONSE);
            responseIntent.putExtra(PushServiceUtils.RESPONSE_METHOD, method);
            responseIntent.putExtra(PushServiceUtils.RESPONSE_ERRCODE,
                    errorCode);
            responseIntent.putExtra(PushServiceUtils.RESPONSE_CONTENT, content);
            responseIntent.setClass(context, MainActivity.class);
            responseIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(responseIntent);

            // 可選。通知使用者點選事件處理
        } else if (intent.getAction().equals(
                PushConstants.ACTION_RECEIVER_NOTIFICATION_CLICK)) {
            Log.d(TAG, "intent=" + intent.toUri(0));

            // 自定義內容的json串
            String customData = intent
                    .getStringExtra(PushConstants.EXTRA_EXTRA);

            Log.d(TAG,
                    "EXTRA_EXTRA = "
                            + intent.getStringExtra(PushConstants.EXTRA_EXTRA));

            if (customData == null || "".equals(customData)) {
                return;
            }

            Intent aIntent = new Intent();
            aIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            aIntent.setClass(
                    context,
                    com.pdwy.wulianwang.mobile.main.notification.NotificationDetails_Activity.class);
            String title = intent
                    .getStringExtra(PushConstants.EXTRA_NOTIFICATION_TITLE);
            aIntent.putExtra(PushConstants.EXTRA_NOTIFICATION_TITLE, title);
            String content = intent
                    .getStringExtra(PushConstants.EXTRA_NOTIFICATION_CONTENT);
            aIntent.putExtra(PushConstants.EXTRA_NOTIFICATION_CONTENT, content);

            String detailContent = "";
            try {
                org.json.JSONObject json = new JSONObject(customData);
                detailContent = json.getString("detailContent");
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            // 儲存在資料庫
            NotifyDao dao = new NotifyDao();
            int notifyId = dao.saveNotify(title, content, detailContent);
            // 向訊息詳細頁傳送內容
            aIntent.putExtra("notify_id", notifyId);

            context.startActivity(aIntent);

        }
    }
}


web端需要做什麼

1.建立專案

2.下載skd,引入包 bccs-api-lib-1.0.jar

3.編寫程式碼。

/*
         * @brief 推送單播通知(Android Push SDK攔截並解析) message_type = 1 (預設為0)
         */

        // 1. 設定developer平臺的ApiKey/SecretKey
        String apiKey = "xxxxxxxxxxxxxxxxxx";
        String secretKey = "xxxxxxxxxxxxx";
        ChannelKeyPair pair = new ChannelKeyPair(apiKey, secretKey);

        // 2. 建立BaiduChannelClient物件例項
        BaiduChannelClient channelClient = new BaiduChannelClient(pair);

        // 3. 若要了解互動細節,請註冊YunLogHandler類
        channelClient.setChannelLogHandler(new YunLogHandler() {
            @Override
            public void onHandle(YunLogEvent event) {
                System.out.println(event.getMessage());
            }
        });

        try {

            // 4. 建立請求類物件
            PushBroadcastMessageRequest request = new PushBroadcastMessageRequest();
            request.setDeviceType(3); // device_type => 1: web 2: pc 3:android
                                        // 4:ios 5:wp

            // request.setMessage("Hello Channel");
            // 若要通知,
            request.setMessageType(1);
            request.setMessage("{\"title\":\"Notify_title_danbo\",\"description\":\"Notify_description_content\"}");
            //request.setMessage(notify.toString());

            // 5. 呼叫pushMessage介面
            PushBroadcastMessageResponse response = channelClient
                    .pushBroadcastMessage(request);

            // 6. 認證推送成功
            System.out.println("push amount : " + response.getSuccessAmount());

        } catch (ChannelClientException e) {
            // 處理客戶端錯誤異常
            e.printStackTrace();
        } catch (ChannelServerException e) {
            // 處理服務端錯誤異常
            System.out.println(String.format(
                    "request_id: %d, error_code: %d, error_message: %s",
                    e.getRequestId(), e.getErrorCode(), e.getErrorMsg()));
        }


上面的程式碼就能傳送一條通知到手機。支援自定義訊息標題,描述,其他自定義內容。

選用百度是個比較簡單實現的方式。截止2013-9-12,我沒有找到相關的收費資訊。本著學習的精神可以研究研究,不過應該也可以再實際專案中使用

相關文章