還記得我們之前介紹過 app 動態註冊 GCM Receiver 的方式嗎?那時候 K.Top 的站長大大還有留言問說如果 app 結束如何不漏接 GCM 訊息,當時是討論到靜態註冊、Service 等等的方式...其實筆者當時也是懵懵懂懂的,畢竟接觸 Android 也沒有粉久,對於 Android 內建的一些功能、機制並不是粉清楚的瞭解。

又經過一段時間的研究後,才瞭解其實靜態註冊過後,即便 app 在背景或是甚至 app 沒有啟動,device 仍然能收到  GCM 發送過來的訊息,主要是因為 AndroidManifest.xml 已經向作業系統「登記」要監聽(receiver)該訊息了,只是收到該訊息後該如何處理,就是由各 app 決定了,因此不需要再寫個 Service 這麼麻煩。

不過以當時接收訊息後是寫了一段 java code 再銜接到 FMX 的 OnReceive,可是如果 app 並非開啟中,這樣寫不就嗝屁了(Instance 並不存在)?

所以必須修改 java code 的寫法,原理就不在此贅述了。趕搭目前流行用語,文章下半段會附上「懶人包」,讓你不知道、不會 GCM,也可以整合自己的 app 在 3 秒鐘之內接收到 GCM 的訊息,只要你事先準備好兩樣東西

1.SenderID

2.AuthorizationKey(API Key)

如果不知道這兩樣是啥,可以先參考之前的文章

輕鬆實用學習 delphi XE5 for Android app(五)Google 雲端通訊(b)申請 GCM 與設備端(client)註冊並取得 regID

先看一下主程式的畫面

其中 app 主要是得向 Google 做 Register Device 的動作,另外一個 SendMsg to Self 則只是為了方便展示用(一般使用情境發訊息應該是 Server 端的事情),接下來看一下 code

先看 Register Button

其中紅框的部分就是你需要把你自己的 Sender ID 填入的地方,其他細節都用 TMyGCMRegister 這個 class 包起來了,再來看展示用的 SendMsg to Self

再次強調 SendMessage 只是為了展示用,一般使用情境不需要在 app 端發送訊息。這部分前半端跟  Register Device 是一樣的,後半段則是透過 AuthorizationKey 把「'這是測試訊息...' + 目前時間」這個訊息傳送出去,同樣的傳送細節的實做用 TMyGCMSender 包起來了

看一下結果吧..

訊息傳送成功,而且幾乎很快在左上角就會多一個小圖示(紅框處),把訊息拉下來看

附上這個專案的所有 source code(懶人包)

如果你是要整合到你自己現有的 app 專案中,那麼需要完成以下幾個動作

1.用壓縮檔案內的 AndroidManifest.template.xml 覆蓋掉你自己專案中的 AndroidManifest.template.xml,如果你的 AndroidManifest.template.xml 之前有手動修改過,那麼就再手動修改一遍吧...

2.用壓縮檔案內的 classes.dex 取代原本 EMBT 附的,這部分需要在你的專案中設定 deployment,像下圖

其中藍色部分就是需要你加入的檔案(壓縮檔內的 classes.dex),紅框處則是要取消勾選的(原本 EMBT 的 classes.dex)

3.最後一步就是在你自己的 app 中,加入 Register Device 這部分的 code(建議在 FormCreate 或 FormActive),而且最好能判斷已經註冊過了沒,以免每次都跑的話會影響 app 啟動的速度

 

祝大家 GCM 玩得愉快...

 

to be continued..

arrow
arrow

    縹緲 發表在 痞客邦 留言(10) 人氣()