Android C2DM學習——雲端推送

來源:互聯網
上載者:User

一.基礎知識

當我們開發需要和伺服器互動的應用程式時,基本上都需要擷取伺服器端的資料,比如《地震及時通》就需要及時擷取伺服器上最新的地震資訊。要擷取伺服器上不定時更新的資訊一般來說有兩種方法,第一種是用戶端使用Pull(拉)的方式,隔一段時間就去伺服器上擷取資訊,看是否有更新的資訊出現。第二種就是伺服器使用Push(推送)的方式,當伺服器端有新資訊了,則把最新的資訊Push到用戶端上。

雖然Pull和Push兩種方式都能實現擷取伺服器端更新資訊的功能,但是明顯來說Push is better than pull。因為Pull方式更費用戶端的網路流量,更主要的是費電量。

Android從2.2版本開始增加了Cloud to Device Messaging(C2DM)架構,在系統中支援了Push功能,基於Android平台使用Push功能更加簡單了。雖然C2DM目前還處在實驗室階段,不過小規模的使用應該沒問題

下面我們就來體驗一下Android的C2DM功能。

二.C2DM架構

使用Android的C2DM功能有幾個要求:

1.       需要Android2.2及以上的系統版本。

2.       使用C2DM功能的Android裝置上需要設定好Google的賬戶。

3.       需要在這裡註冊使用C2DM功能的使用者郵箱帳號(最好為C2DM單獨註冊一個Gmail郵箱帳號)。

我們接下來C2DM的一個完整過程,這裡借用一下Google官方推出的Chrome To Phone過程圖來說明下。

 

要使用C2DM來進行Push操作,基本上要使用以下6個步驟:

         (1)註冊:Android裝置把使用C2DM功能的使用者賬戶(比如android.c2dm.demo@gmail.com)和App名稱發送給C2DM伺服器。

         (2)C2DM伺服器會返回一個registration_id值給Android裝置,裝置需要儲存這個registration_id值。

         (3)Android裝置把獲得的registration_id和C2DM功能的使用者賬戶(android.c2dm.demo@gmail.com)發送給自己的伺服器,不過一般使用者賬戶資訊因為和伺服器確定好的,所以不必發送。

這樣Android裝置就完成了C2DM功能的註冊過程,接下來就可以接收C2DM伺服器Push過來的訊息了。

         (4)伺服器獲得資料。這裡圖中的例子Chrome To Phone,伺服器接收到Chrome瀏覽器發送的資料。資料也可以是伺服器本地產生的。這裡的伺服器是Google AppEngine(很好的一項服務,可惜在國內被屏了),要換成自己的伺服器。伺服器還要擷取註冊使用C2DM功能的使用者賬戶(android.c2dm.demo@gmail.com)的ClientLogin許可權Auth。

         (5)伺服器把要發送的資料和registration_id一起,並且頭部帶上擷取的Auth,使用POST的方式發送給C2DM伺服器。

         (6)C2DM伺服器會以Push的方式把資料發送給對應的Android裝置,Android裝置只要在程式中按之前和伺服器商量好的格式從對應的key中擷取資料即可。

         這樣我們就大概明白了C2DM的工作流程,下面我們就結合一個執行個體來具體的說明以上6個步驟。

三.執行個體開發

我們要建立的程式名稱為AndroidC2DMDemo,包名為com.ichliebephone.c2dm。

開始之前我們先去C2DM網頁上註冊一下使用C2DM功能的使用者賬戶。

圖2 應用程式名稱

         其中應用程式名稱要填寫帶包名的完整名稱,比如這裡為om.ichliebephone.c2dm. AndroidC2DMDemo。

圖3 C2DM使用者賬戶註冊

         這裡的contact郵箱使用一個你能接收到郵件的郵箱即可,下面的Role(sender)account郵箱最好單獨註冊一個Gmail郵箱來使用C2DM服務。我們這裡使用的是專門註冊的android.c2dm.deno@gmail.com郵箱。

         提交後,過一段時間就會收到Google發送過來的確認郵件,然後你就可以使用C2DM的Push服務了。

        

介紹了這麼多,我們先來快速完成一個執行個體,只完成Android裝置端的註冊部分,不包含向伺服器發送registration_id和伺服器向C2DM伺服器發送資料的具體代碼,這部分只是用Ubuntu下的curl命令來類比,主要是快速親自體驗一下Push的結果。

建立一個Android工程AndroidC2DMDemo,並且包含進Google的開源例子Chrome To Phone中的c2dm包com.google.android.c2dm,包中包含三個Java類,分別為:

第一個類為C2DMBaseReceiver:

C2DMBaseReceiver

第二個類為C2DMBroadcastReceiver:

C2DMBroadcastReceiver

第三個類為C2DMessaging:

C2DMessaging

代碼中已添加了部分中文注釋,可以先大概瞭解下,等整個工程建立完了在一起解釋。

然後建立我們自己的包com.ichliebephone.c2dm,包含兩個類,一個是工程的入口AndroidC2DMDemo:

AndroidC2DMDemo

很簡單,就是開始向C2DM伺服器進行註冊。

另一個類為C2DMBaseReceiver的子類C2DMReceiver:

C2DMReceiver

在這個類中我們主要在接收到Push的回呼函數onMessage中對訊息進行了接收,並且使用Notification的方式顯示在狀態列上。

我們完整的工程目錄是這樣的:

圖4 工程目錄

         最後我們還要在AndroidManifest.xml中增加對應的許可權等內容:

AndroidManifest.xml

因為C2DM功能只有2.2及以上的Android系統才支援,因此建立一個2.2及以上的AVD,然後在”設定->賬戶與同步”裡還要設定好Google Account,如所示:

圖5 設定Android裝置中的Google賬戶

然後就可以運行程式了,我們會在DDMS輸出中看到獲得的registration_id:

圖6 獲得的registration_id

如果第一次運行沒有出現,試著再運行一次。

有了registration_id,我們的伺服器端就可以向C2DM端發送需要Push的資料了,這裡進行簡單化處理下,在Ubuntu下直接使用curl命令來類比伺服器功能向C2DM發送資料。

我們先來擷取C2DM的ClientLogin許可權Auth,在Ubuntu終端下輸入:

1 lingaohe@lingaohe-laptop:~$ curl -d "accountType=HOSTED_OR_GOOGLE&Email=android.c2dm.demo@gmail.com&Passwd=androidc2dmdemo&service=ac2dm&source=bupt-c2dmdemo-1.0" https://www.google.com/accounts/ClientLogin

這個表示以POST的方式向https://www.google.com/accounts/ClientLogin發送資料,其中把Email和Passwd換成你自己在C2DM網頁上註冊的郵箱號和密碼。

如果你的郵箱已在C2DM網頁上註冊,並且密碼沒有錯誤的話就會返回需要的Auth內容:

1 SID=DQAAAKYAAADcTtHbBBNcZJEOfkfVRycD_ZOIidwsQ3UwIY7cSrYWaY6uhlfo0l9gRPB-mQxP4K2T5tWiG--vWVmSTeq5p8SPwgnsYvfzj7bkNiPPIy4xRimVVfBmAHnZgLohw7gHMKi5DS6kK-Ut5tNzdTkI0I2tUDF0ryQ7MnPpI6Sj-gUCyBXmvKatHHDnNTTV78XdGIx7FYej1DyqGsPsYo3bCstHgltjv3cd2Hs7D4yrpUWHZw2 LSID=DQAAAKgAAABCpaoUE4XvxM24Cofntw1IUGx5fKxX-m7aqTL0zhunP0OjzJ2sn9ywmPa1BMZ2cF2IchuxHFLVzaSQfydAmiHZJGXLgaUorpIN6yz1e0VFWKmS6j4wGjZOos3QoJ9rkha0jKbOiHfBesADjxk-qjJ24TJ0RL-xkZHQyzS69YlA1KyzqIKjAMCzgqaDfCwhqxylJzizJksO2h8xpAFXZ38d_grm8XYZtzejiCiAMAR65A3 Auth=DQAAAKoAAACRF4pgYULnXULoWgbwfdqmMiRhfZYa1l-LW_rwGD7cofov4L4c2bVrtCOXbEbkju_hhqdAonpMkrb5icptt28fU8c-s-u1y2MXNYDxPIdQzfA2t6oI3NTmyj35MpsR1NKL4TN7ZVEn6z9NueuiKAqLHukZYh1YMGkGC8M6rVvA7AWPW36064XCQED7KLVNp_pGT00lrni7UdZKZWEy0FT-EVR-OxDyHWw6C-5Kmfkisw

返回的內容包括SID,LSID和Auth三個部分,其中Auth是我們需要的內容。

有了Auth和registration_id值後,我們就可以繼續用curl命令類比我們自己伺服器的功能向C2DM發送要推送的資料:

1 lingaohe@lingaohe-laptop:~$ curl -H "Authorization:GoogleLogin auth=DQAAAKoAAACRF4pgYULnXULoWgbwfdqmMiRhfZYa1l-LW_rwGD7cofov4L4c2bVrtCOXbEbkju_hhqdAonpMkrb5icptt28fU8c-s-u1y2MXNYDxPIdQzfA2t6oI3NTmyj35MpsR1NKL4TN7ZVEn6z9NueuiKAqLHukZYh1YMGkGC8M6rVvA7AWPW36064XCQED7KLVNp_pGT00lrni7UdZKZWEy0FT-EVR-OxDyHWw6C-5Kmfkisw" -d "registration_id=APA91bGUBoSvt3G5Ny9t0IGLmIKAKYX6G6VHwSQHh3tP2fqcaQ0N4GPdKh5B3RDUHFCFF06YwT8ifOP_cOy5BAWyCLHL8d8NpuIW9AqXt9h2JSBVF2MitZA&collapse_key=1&data.msg=ichliebejiajia" https://android.apis.google.com/c2dm/send

其中發送的資料部分為data.msg=ichliebejiajia,表示發送的資料內容為ichliebejiajia,索引值為msg,索引值得和Android終端上的程式統一好,以便終端上可以擷取。如果發送成功,會返回一個id值,比如:

1 id=0:1308623423080544%6c5c15c2000000312 lingaohe@lingaohe-laptop:~$

這時我們的伺服器就已經把資料發送給C2DM伺服器了,Android裝置上一會就能接收到C2DM伺服器Push的資料。

在我們的例子中我們可以看到DDMS中列印出的訊息:

圖7 擷取到的Push資料

同時Android模擬器的狀態列上會有對應的通知顯示:

圖8 Android模擬器接收到的Push資料

       這樣我們就快速實現了下Android的C2DM架構的Push功能。進一步的具體解釋說明及伺服器端的代碼處理我們以後再學習。

 

文章對應的完整代碼例子:

http://download.csdn.net/source/3425855

轉載自:http://blog.csdn.net/ichliebephone/article/details/6591071

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.