標籤:android http ar io os 使用 sp for java
需求
必備知識
這篇文章至少需要有過一個中等層次的PhoneGap的開發經驗
必須產品
PhoneGap Build
使用者級
全部適用
我上一篇文章是通過PhoneGap能夠在蘋果裝置上推播通知。在這篇文章中,我將會講解如何在Android平台上使用PhoneGap去推播通知。通過對比,我發下我的通知在Android裝置上的推送速度更快。
Google Cloud Messaging
Android的通知推送可以通過 GoogleCloud Messaging(GCM)的服務,這個和蘋果的通知推送服務相似。以前它們都是對C2DM支援(用於雲與裝置之間訊息傳遞的架構),但是現在那些API已經放棄使用了,還有就是GoogleCloud Message提供了更多增強實現,這些都是C2DM所提供不到的。通過 Cordova/PhoneGap 外掛程式能夠幫組你利用到GoogleCloud Messaging的服務。
訊息的大小分配給GCM的淨負荷是4kb(只是字串資料),明顯地比蘋果推送所要求的256個位要大很多。這裡有一篇文章關於這些訊息發送到底支援那些資料類型。還有我建議你在你構建你的應用程式之前先在這裡閱讀一下應該怎樣去使用這樣服務,因為我在這篇文章中很多關於這方面的細節都沒有討論到。某些點我需要在這篇文章中著重強調一下是:
- 並不需要在一個Android裝置上運行一個Android應用才能接受到訊息。其實它是通過網路的廣播,當一個訊息到達的時候,系統就會喚醒Android應用,當然這需要你為你的應用程式設定好正確的廣播接受者和許可權。
- GCM並不提供任何內建的使用者介面或者訊息的處理。GCM只是簡單的傳遞沒處理過的訊息資料然後直接送到對應的Android應用上,這樣你就擁有全部對資料處理的權利。例如應用可以發送一個通知、顯示一個自訂的使用者介面或者悄悄地同步資料。
設定如何去推播通知
通過這些步驟就能在你的Android 應用程式去推播通知:
1. 通過命令列工具或者Eclipse去建立一個AndroidCordova 項目(我們推薦使用命令列)
2. 下載GCM Cordova 外掛程式。
3. 跟著外掛程式說明的以下步驟:
- <?xml:namespace prefix = "o" />
-
- https://code.google.com/apis/console/?pli=1#project:824841663942
複製代碼
- window.GCM.register("[your_sender_id]", "GCM_Event", GCM_Success, GCM_Fail );
複製代碼
- 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”
2013-5-14 16:04:00 上傳
下載附件 (23.84 KB)
圖1.選擇“Android Project from Existing Code”。
運行樣本應用
當你運行外掛程式中的範例程式碼時,它會嘗試自動註冊你的裝置。如果註冊成功,你會看到訊息中包含一個註冊ID。(看看下面中我圈起來的REGID字串,這是我在我的Galaxy Tablet中運行得到的結果)
2013-5-14 16:04:00 上傳
下載附件 (14.69 KB)
圖2:你會看到訊息中包含一個註冊的ID
當然你也應該可以在你的控制台中看看一下的輸出:
- 10-24 18:24:20.720: V/GCMReceiver:onRegistered(21989): Registration ID arrived!
- 10-24 18:24:20.730: V/GCMReceiver:onRegisterd(21989): {"regid":"APA91bFobAwM7P3Okxy2al8RI12VcJFUS-giXWTOoWXIObtSPOE1h7FuH1VPLBPgshDI_Fp7aIYVET-ssvGUErlWYA0cKPGhoXT1daqyDsEfem9ZtgZNRhQFv7kLCIVSigYlpMluToPiSHSsFSEdtCDfKoOZqNPsfg","event":"registered"}
- 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去發送一個通知。當收到這個訊息時,你將會看到如下面所示的文本顯示在螢幕上:
2013-5-14 16:04:01 上傳
下載附件 (13.26 KB)
圖3.當收到一條訊息時,你將會看到這些資訊顯示出來。
這是雖然這個外掛程式不做任何的處理。接下來的部分我們將會講解通過添加一些代碼使得但接收到一條訊息的時候將會顯示一個狀態列通知。
狀態列通知
由於這個外掛程式只是簡單地接收訊息——不管你的應用程式是否是在運行——但是即使訊息到達了也沒有做任何處理,你決定它應該做出怎樣的響應。一個常見的需求就是把這個訊息顯示在一個原生的狀態列上。在IOS上,這個過程會有所不同,這個通知會被自動顯示。但是在Android上你需要為它編寫明確的代碼。
其中一個選擇就是使用Cordova StatusBarNotification 外掛程式去實現這樣的效果。如果你想用更快的解決方案,你可以通過簡單添加原生的Java代碼到你的GCMIntentService.javaonMessage()方法裡面,就像一下代碼那樣:
- String message = extras.getString("message");
- String title = extras.getString("title");
- Notification notif = new Notification(android.R.drawable.btn_star_big_on, message, System.currentTimeMillis() );
- notif.flags = Notification.FLAG_AUTO_CANCEL;
- notif.defaults |= Notification.DEFAULT_SOUND;
- notif.defaults |= Notification.DEFAULT_VIBRATE;
-
- Intent notificationIntent = new Intent(context, TestSampleApp.class);
- notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
- PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
-
- notif.setLatestEventInfo(context, title, message, contentIntent);
- String ns = Context.NOTIFICATION_SERVICE;
- NotificationManager mNotificationManager = (NotificationManager)
- context.getSystemService(ns);
- mNotificationManager.notify(1, notif);
複製代碼
還有要記得要添加以下的匯入,這樣上面的代碼才能實現:
- import android.app.Notification;
- import android.app.NotificationManager;
- import android.app.PendingIntent;
複製代碼
要確定你已經使用YourActivityClassName.class替換繼承至DroidGap的子類的名字。例如,在樣本項目中我們叫它MainActivity。
以上的代碼將會設定一個帶有一個星星圖片的通知,並伴隨震動和預設聲音。這個例子已經在我的Android Galaxy Tablet上運行了,圖如下所示(紅色圈圈標記)
2013-5-14 16:04:02 上傳
下載附件 (20.39 KB)
圖4.狀態列通知(包含星型圖片和震動、預設聲音)
當你點擊這個通知後,那麼應用程式將會開啟並顯示它說真實收到的訊息。
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將會在你的螢幕和控制台上顯示。
- var gcm = require(‘node-gcm‘);
-
- var message = new gcm.Message();
- var sender = new gcm.Sender(‘AIzaSyCDx8v9R0fMsAsjoAffF-P3FCFWXlvwKgL‘);
- var registrationIds = [];
-
- message.addData(‘title‘,‘My Game‘);
- message.addData(‘message‘,‘Your turn!!!!‘);
- message.addData(‘msgcnt‘,‘1‘);
- message.collapseKey = ‘demo‘;
- message.delayWhileIdle = true;
- message.timeToLive = 3;
-
- // At least one token is required - each app registers a different token
- registrationIds.push(‘APA91bFobAwN7P3Okxy2al8RI12VcJFUS-giXWTOoWXIObtSPOE1h7FuH1VPLBPgshDI_Fp7aIYVET-ssvGUErlWYA0cKPGhoXT1daqyDsEfem9ZtgZNRhQFv7kLCIVSigYlpMluToPiSHSsFSEdtCDfKoOZqNPgfs‘);
-
- /**
- * Parameters: message-literal, registrationIds-array, No. of retries, callback-function
- */
- sender.send(message, registrationIds, 4, function (result) {
- console.log(result);
- });
- /** Use the following line if you want to send the message without retries
- sender.sendNoRetry(message, registrationIds, function (result) {
- console.log(result); });
- **/
複製代碼
要為title鍵和message鍵明確地指定title和message,因為程式的外掛程式將會在GCMIntentService.java中尋找它:
- Bundle extras = intent.getExtras();
- if (extras != null) {
- try {
- String title = extras.getString("title");
- String message = extras.getString("message");
- ....
- }
- }
複製代碼
摺疊鍵
根據Android的開發文檔,當你定義一個摺疊鍵時,它只會分發給你最後收到的通知和一個給定的摺疊鍵,為了不讓使用者被“過多的通知”煩擾例如像體育比賽中的分數。
2013-5-14 16:04:04 上傳
下載附件 (23.25 KB)
圖6.為title鍵和message鍵指定明確的title和message。注意在彈出列表中所出現的狀態列通知(如果被受理),像圖7所示
2013-5-14 16:04:04 上傳
下載附件 (23.86 KB)
圖7.狀態列通知在彈出框中顯示
其它可供選擇的外掛程式
遲點我將會解釋那些你在Android上使用Cordova去推播通知時要用到的資料,你可能會想到在GitHub那裡的另外一個外掛程式。這個外掛程式是為了能夠讓捏充分利用PushWoosh去推播通知而設計出來的,這個我在我的博文中發布過,“使用Pushwoosh讓你能夠簡單通過PhoneGap去推播通知”。這個外掛程式的API和IOS上的Cordova 通知推送外掛程式類似,有趣的是,當我測試它的時候,即使不在PushWoosh伺服器的環境下,我的Node.js服務仍然能夠接收到所推送的訊息。此外,我並不需要添加任何原生的Java代碼,能夠讓上面的狀態列通知顯示。
下一步
以下的這些串連你可能需要點擊進去看一下
-
通過Pushwoosh去利用PhoneGap去推播通知
-
Cordovapush項目——依據node-apn和node-gcm的跨平台的推送服務。
-
Urban Airship 通知推送伺服器——融合了PhoneGap
這些只能在CreativeCommons Attribution-Noncommercial-Share Alike 3.0 Unported License的許可下被運用到。許可權只能在功能內,關於這個例子的代碼(包括項目中用到的)都可以在Adobe上找到。
原文連結:http://www.adobe.com/devnet/phonegap/articles/android-push-notifications-with-phonegap.html
通過PhoneGap在Android上去推播通知