經過PhoneGap在Android上去推送通知

需求 javascript

必備知識 php

這篇文章至少須要有過一箇中等層次的PhoneGap的開發經驗 html

必須產品 java

PhoneGap Build node


用戶級 android

所有適用 git


上一篇文章是經過PhoneGap可以在蘋果設備上推送通知。在這篇文章中,我將會講解如何在Android平臺上使用PhoneGap去推送通知。經過對比,我發下個人通知在Android設備上的推送速度更快。 github


Google Cloud Messaging npm


Android的通知推送能夠經過 GoogleCloud Messaging(GCM)的服務,這個和蘋果的通知推送服務類似。之前它們都是對C2DM支持(用於雲與設備之間消息傳遞的框架),可是如今那些API已經放棄使用了,還有就是GoogleCloud Message提供了更多加強實現,這些都是C2DM所提供不到的。經過 Cordova/PhoneGap 插件可以幫組你利用到GoogleCloud Messaging的服務。 api


消息的大小分配給GCM的淨負荷是4kb(只是字符串數據),明顯地比蘋果推送所要求的256個位要大不少。這裏有一篇文章關於這些消息發送到底支持那些數據類型。還有我建議你在你構建你的應用程序以前先在這裏閱讀一下應該怎樣去使用這樣服務,由於我在這篇文章中不少關於這方面的細節都沒有討論到。某些點我須要在這篇文章中着重強調一下是:

  • GCM並不保證消息的分發或者它的順序。
  • 並不須要在一個Android設備上運行一個Android應用才能接受到消息。其實它是經過網絡的廣播,當一個消息到達的時候,系統就會喚醒Android應用,固然這須要你爲你的應用程序設置好正確的廣播接受者和權限。
  • GCM並不提供任何內建的用戶接口或者消息的處理。GCM只是簡單的傳遞沒處理過的消息數據而後直接送到對應的Android應用上,這樣你就擁有所有對數據處理的權利。例如應用能夠發送一個通知、顯示一個自定義的用戶接口或者悄悄地同步數據。

設置如何去推送通知

經過這些步驟就能在你的Android 應用程序去推送通知:

1.      經過命令行工具或者Eclipse去建立一個AndroidCordova 項目(咱們推薦使用命令行)

2.      下載GCM Cordova 插件

3.      跟着插件說明的如下步驟:

  •   要跟着說明文檔所寫地去設置你的Google Cloud Messaging 賬號和注意記下位於URL中的項目ID。舉個例子,下面加粗的數字就是你須要發送給register()方法:






  1. <?xml:namespace prefix = "o" />

  2. https://code.google.com/apis/console/?pli=1#project:824841663942
複製代碼


  •   不要忘記將如下代碼換成你的GCM項目的ID






  1. window.GCM.register("[your_sender_id]", "GCM_Event", GCM_Success, GCM_Fail );
複製代碼




  •   包含你的發送器的ID






  1. window.GCM.register("824841663942", "GCM_Event", GCM_Success, GCM_Fail );
複製代碼




4. 當一個應用接受到一個消息的時候要爲它添加處理函數決定它是否打開。例如你可能會顯示一個彈出警告或者一個狀態欄通知。

Note:這個插件將會處理GCM的登記,並有對應的方法去接收一個消息,但它實際上並不爲這些通知作出響應,這些就是你須要添加的東西。你也能夠去更深刻閱讀關於如何瞭解怎麼添加原生代碼去產生一個狀態欄通知。


若是你須要更多有關於建立GCM項目的資料,某些特定的步驟你能夠在這裏找到。


PhoneGap插件包含一個簡單的項目,並已經爲通知推送設置寄存器,包括改變了AndroidManifest.xml和插件的配置。而你所要作的事就是修改CORDOVA_GCM_script.js文件,這樣你就可以在你的register()函數裏面使用GCM發送者/項目的ID,這有你立馬運行它或者將這個項目做爲參考並根據本身的需求作修改。


若是你偏向於利用Eclipse去編寫你的代碼,那麼你簡單地經過導入以前所建立幷包含該插件的Android項目,這樣你就能夠開始你的工做了。

1. Choose File | New |Project

2. 選擇「Android Project from Existing Code」

android-push-notifications-with-phonegap-fig01.jpg

2013-5-14 16:04:00 上傳
下載附件 (23.84 KB)

圖1.選擇「Android Project from Existing Code」。


運行示例應用

當你運行插件中的示例代碼時,它會嘗試自動註冊你的設備。若是註冊成功,你會看到消息中包含一個註冊ID。(看看下面截圖中我圈起來的REGID字符串,這是我在個人Galaxy Tablet中運行獲得的結果)

android-push-notifications-with-phonegap-fig02.jpg

2013-5-14 16:04:00 上傳
下載附件 (14.69 KB)

圖2:你會看到消息中包含一個註冊的ID

固然你也應該能夠在你的控制面板中看看一下的輸出:




  1. 10-24 18:24:20.720: V/GCMReceiver:onRegistered(21989): Registration ID arrived!
  2. 10-24 18:24:20.730: V/GCMReceiver:onRegisterd(21989): {"regid":"APA91bFobAwM7P3Okxy2al8RI12VcJFUS-giXWTOoWXIObtSPOE1h7FuH1VPLBPgshDI_Fp7aIYVET-ssvGUErlWYA0cKPGhoXT1daqyDsEfem9ZtgZNRhQFv7kLCIVSigYlpMluToPiSHSsFSEdtCDfKoOZqNPsfg","event":"registered"}
  3. 10-24 18:24:20.730: V/GCMPlugin:sendJavascript(21989): javascript:GCM_Event({"regid":"APA91bFobAwM7P3Okxy2al8RI12VcJFUS-giXWTOoWXIObtSPOE1h7FuH1VPLBPgshDI_Fp7aIYVET-ssvGUErlWYA0cKPGhoXT1daqyDsEfem9ZtgZNRhQFv7kLCIVSigYlpMluToPiSHSsFSEdtCDfKoOZqNPsfg","event":"registered"})
複製代碼




一旦你獲得了像以上所示的註冊ID,你就能夠開始編寫你的服務端代碼。如下的部分將會講解怎麼使用Node.JS代碼去發送一條消息給你的應用程序。或者,你也可使用Urban Airship或者PushWoosh去發送一個通知。當收到這個消息時,你將會看到以下面截圖所示的文本顯示在屏幕上:

android-push-notifications-with-phonegap-fig03.jpg

2013-5-14 16:04:01 上傳
下載附件 (13.26 KB)

圖3.當收到一條消息時,你將會看到這些信息顯示出來。


這是雖然這個插件不作任何的處理。接下來的部分咱們將會講解經過添加一些代碼使得但接收到一條消息的時候將會顯示一個狀態欄通知。


狀態欄通知


因爲這個插件只是簡單地接收消息——無論你的應用程序是不是在運行——可是即便消息到達了也沒有作任何處理,你決定它應該作出怎樣的響應。一個常見的需求就是把這個消息顯示在一個原生的狀態欄上。在IOS上,這個過程會有所不一樣,這個通知會被自動顯示。可是在Android上你須要爲它編寫明確的代碼。


其中一個選擇就是使用Cordova StatusBarNotification 插件去實現這樣的效果。若是你想用更快的解決方案,你能夠經過簡單添加原生的Java代碼到你的GCMIntentService.javaonMessage()方法裏面,就像一下代碼那樣:


  1. String message = extras.getString("message");
  2. String title = extras.getString("title");
  3. Notification notif = new Notification(android.R.drawable.btn_star_big_on, message, System.currentTimeMillis() );
  4. notif.flags = Notification.FLAG_AUTO_CANCEL;
  5. notif.defaults |= Notification.DEFAULT_SOUND;
  6. notif.defaults |= Notification.DEFAULT_VIBRATE;

  7. Intent notificationIntent = new Intent(context, TestSampleApp.class);
  8. notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
  9. PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

  10. notif.setLatestEventInfo(context, title, message, contentIntent);
  11. String ns = Context.NOTIFICATION_SERVICE;
  12. NotificationManager mNotificationManager = (NotificationManager)
  13. context.getSystemService(ns);
  14. mNotificationManager.notify(1, notif);
複製代碼



還有要記得要添加如下的導入,這樣上面的代碼才能實現:





  1. import android.app.Notification;
  2. import android.app.NotificationManager;
  3. import android.app.PendingIntent;
複製代碼




要肯定你已經使用YourActivityClassName.class替換繼承至DroidGap的子類的名字。例如,在示例項目中咱們叫它MainActivity。


以上的代碼將會設置一個帶有一個星星圖片的通知,並伴隨震動和默認聲音。這個例子已經在個人Android Galaxy Tablet上運行了,圖以下所示(紅色圈圈標記)


android-push-notifications-with-phonegap-fig04.jpg

2013-5-14 16:04:02 上傳
下載附件 (20.39 KB)

圖4.狀態欄通知(包含星型圖片和震動、默認聲音)


當你點擊這個通知後,那麼應用程序將會打開並顯示它說真實收到的消息。

android-push-notifications-with-phonegap-fig05.jpg

2013-5-14 16:04:03 上傳
下載附件 (13.26 KB)

圖5.點擊那個通知將會觸發應用程序打開並顯示它所收到的消息。


狀態欄的顯示因不一樣的設備而有所不一樣。在通常的Android手機上,是會顯示在最上面而不是像個人截圖那樣顯示在底端。


經過node-gcm去發送一條消息


這裏是經過Node.js 庫使得Google Cloud Messaging去發送通知。它被稱爲稱爲node-gcm。下面的這些代碼是爲了讓個人設備能發送一條消息。

相信大家注意到我改變了那些鍵。在發送的參數中,用你在申請Google Cloud Messaging 服務時Google給你的ID去指定你本身的API鍵。你會收到兩個API鍵,一個瀏覽器鍵和服務器鍵,這裏兩個可能都會用到。若是其中一個不能用,試一下另一個。還有就是當你註冊使用到以上插件的時候,也要指定返回給你的應用程序的值。當你運行你的應用程序並調用GCM register函數的時候,註冊的ID將會在你的屏幕和控制檯上顯示。





  1. var gcm = require('node-gcm');

  2. var message = new gcm.Message();
  3. var sender = new gcm.Sender('AIzaSyCDx8v9R0fMsAsjoAffF-P3FCFWXlvwKgL');
  4. var registrationIds = [];

  5. message.addData('title','My Game');
  6. message.addData('message','Your turn!!!!');
  7. message.addData('msgcnt','1');
  8. message.collapseKey = 'demo';
  9. message.delayWhileIdle = true;
  10. message.timeToLive = 3;

  11. // At least one token is required - each app registers a different token
  12. registrationIds.push('APA91bFobAwN7P3Okxy2al8RI12VcJFUS-giXWTOoWXIObtSPOE1h7FuH1VPLBPgshDI_Fp7aIYVET-ssvGUErlWYA0cKPGhoXT1daqyDsEfem9ZtgZNRhQFv7kLCIVSigYlpMluToPiSHSsFSEdtCDfKoOZqNPgfs');

  13. /**
  14. * Parameters: message-literal, registrationIds-array, No. of retries, callback-function
  15. */
  16. sender.send(message, registrationIds, 4, function (result) {
  17.     console.log(result);
  18. });
  19. /** Use the following line if you want to send the message without retries
  20. sender.sendNoRetry(message, registrationIds, function (result) {
  21. console.log(result); });
  22. **/
複製代碼




要爲title鍵和message鍵明確地指定titlemessage,由於程序的插件將會在GCMIntentService.java中查找它:


  1. Bundle extras = intent.getExtras();
  2.     if (extras != null) {
  3.         try {
  4.           String title = extras.getString("title");
  5.           String message = extras.getString("message");
  6.           ....
  7.         }
  8.      }
複製代碼




摺疊鍵

根據Android的開發文檔,當你定義一個摺疊鍵時,它只會分發給你最後收到的通知和一個給定的摺疊鍵,爲了避免讓用戶被「過多的通知」煩擾例如像體育比賽中的分數。

android-push-notifications-with-phonegap-fig06.jpg

2013-5-14 16:04:04 上傳
下載附件 (23.25 KB)

圖6.爲title鍵和message鍵指定明確的title和message。注意在彈出列表中所出現的狀態欄通知(若是被受理),像圖7所示

android-push-notifications-with-phonegap-fig07.jpg

2013-5-14 16:04:04 上傳
下載附件 (23.86 KB)

圖7.狀態欄通知在彈出框中顯示


其它可供選擇的插件

遲點我將會解釋那些你在Android上使用Cordova去推送通知時要用到的資料,你可能會想到在GitHub那裏的另一個插件。這個插件是爲了可以讓捏充分利用PushWoosh去推送通知而設計出來的,這個我在個人博文中發佈過,「使用Pushwoosh讓你可以簡單經過PhoneGap去推送通知」。這個插件的API和IOS上的Cordova 通知推送插件相似,有趣的是,當我測試它的時候,即便不在PushWoosh服務器的環境下,個人Node.js服務仍然可以接收到所推送的消息。此外,我並不須要添加任何原生的Java代碼,可以讓上面的狀態欄通知顯示。


下一步

如下的這些鏈接你可能須要點擊進去看一下


這些只能在CreativeCommons Attribution-Noncommercial-Share Alike 3.0 Unported License的許可下被運用到。權限只能在許可範圍內,關於這個例子的代碼(包括項目中用到的)均可以在Adobe上找到。

原文連接:http://www.adobe.com/devnet/phonegap/articles/android-push-notifications-with-phonegap.html

相關文章
相關標籤/搜索