編輯:關於Android編程
本文實例講述了Android編程實現google消息通知功能。分享給大家供大家參考,具體如下:
1. 定義一個派生於WakefulBroadcastReceiver的類
public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { private static final String TAG = "GcmBroadcastReceiver"; @Override public void onReceive(Context context, Intent intent) { Log.v(TAG, "onReceive start"); ComponentName comp = new ComponentName(context.getPackageName(), GcmIntentService.class.getName()); startWakefulService(context, (intent.setComponent(comp))); setResultCode(Activity.RESULT_OK); Log.v(TAG, "onReceive end"); } }
2. 用於處理broadcast消息的類
public class GcmIntentService extends IntentService { private static final String TAG = "GcmIntentService"; public static final int NOTIFICATION_ID = 1; private NotificationManager mNotificationManager; NotificationCompat.Builder builder; private Intent mIntent; public GcmIntentService() { super("GcmIntentService"); Log.v(TAG, "GcmIntentService start"); Log.v(TAG, "GcmIntentService end"); } @Override protected void onHandleIntent(Intent intent) { Log.v(TAG, "onHandleIntent start"); Bundle extras = intent.getExtras(); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); String messageType = gcm.getMessageType(intent); if (!extras.isEmpty()) { if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR .equals(messageType)) { sendNotification(extras.getString("from"), "Send error", extras.toString(), "", null, null); } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED .equals(messageType)) { sendNotification(extras.getString("from"), "Deleted messages on server", extras.toString(), "", null, null); } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE .equals(messageType)) { Log.v(TAG, "BUNDLE SIZE = " + extras.size()); boolean sendreply = false; String msgid = null; for (String key : extras.keySet()) { if ("gcm.notification.title".equals(key) || "gcm.notification.body".equals(key) || "gcm.notification.click_action".equals(key) || "gcm.notification.orderNumber".equals(key)) { Log.v(TAG, "KEY=" + key + " DATA=" + extras.getString(key)); } else if ("gcm.notification.messageId".equals(key)) { sendreply = true; msgid = extras.getString(key); Log.v(TAG, "KEY=" + key + " DATA=" + msgid); } else { Log.v(TAG, "KEY=" + key); } } sendNotification(extras.getString("from"), extras.getString("gcm.notification.title"), extras.getString("gcm.notification.body"), extras.getString("gcm.notification.click_action"), extras.getString("gcm.notification.orderNumber"), msgid); Log.i(TAG, "Received: " + extras.toString()); mIntent = intent; if (sendreply) { new SendReceivedReply().execute(msgid); } else { GcmBroadcastReceiver.completeWakefulIntent(intent); } } } else { GcmBroadcastReceiver.completeWakefulIntent(intent); } Log.v(TAG, "onHandleIntent end"); } private void sendNotification(String from, String title, String msg, String action, String ordernumber, String msgid) { Log.v(TAG, "sendNotification start"); Log.v(TAG, "FROM=" + from + " TITLE=" + title + " MSG=" + msg + " ACTION=" + action + " ORDERNUMBER=" + ordernumber); mNotificationManager = (NotificationManager) this .getSystemService(Context.NOTIFICATION_SERVICE); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder( this).setSmallIcon(R.drawable.ic_launcher) .setContentTitle(title) .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setContentText(msg) .setSound(Settings.System.DEFAULT_NOTIFICATION_URI); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, ActivitySplash.class), 0); mBuilder.setContentIntent(contentIntent); if (ordernumber == null) { mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); } else { int n = ordernumber.charAt(0); String s = String.format(Locale.ENGLISH, "%d%s", n, ordernumber.substring(1)); n = Integer.valueOf(s); Log.v(TAG, "NOTIF ID=" + n); mNotificationManager.notify(n, mBuilder.build()); } GregorianCalendar c = new GregorianCalendar(); UtilDb.msgAdd(c.getTimeInMillis(), title, msg, msgid); Intent intent = new Intent(UtilConst.BROADCAST_MESSAGE); LocalBroadcastManager.getInstance(this).sendBroadcast(intent); Log.v(TAG, "sendNotification end"); } /*************************************************************/ /************************** ASYNCTASK ************************/ /*************************************************************/ private class SendReceivedReply extends AsyncTask<String, Void, Void> { @Override protected Void doInBackground(String... params) { if (params[0] != null) { ArrayList<NameValuePair> nvp = new ArrayList<NameValuePair>(); nvp.add(new BasicNameValuePair("MessageId", params[0])); UtilApp.doHttpPost(getString(R.string.url_base) + getString(R.string.url_msg_send_received), nvp, null); } return null; } @Override protected void onPostExecute(Void result) { GcmBroadcastReceiver.completeWakefulIntent(mIntent); } } }
服務器端(C#):
public class GoogleNotificationRequestObj { public IList<string> registration_ids { get; set; } public Dictionary<string, string> notification { get; set; } } private static ILog _log = LogManager.GetLogger(typeof(GoogleNotification)); public static string CallGoogleAPI(string receiverList, string title, string message, string messageId = "-1") { string result = ""; string applicationId = ConfigurationManager.AppSettings["GcmAuthKey"]; WebRequest wRequest; wRequest = WebRequest.Create("https://gcm-http.googleapis.com/gcm/send"); wRequest.Method = "post"; wRequest.ContentType = " application/json;charset=UTF-8"; wRequest.Headers.Add(string.Format("Authorization: key={0}", applicationId)); string postData; var obj = new GoogleNotificationRequestObj() { registration_ids = new List<string>() { receiverList }, notification = new Dictionary<string, string> { {"body", message}, {"title", title} } }; if (messageId != "-1") { obj.notification.Add("messageId", messageId); } postData = JsonConvert.SerializeObject(obj); _log.Info(postData); Byte[] bytes = Encoding.UTF8.GetBytes(postData); wRequest.ContentLength = bytes.Length; Stream stream = wRequest.GetRequestStream(); stream.Write(bytes, 0, bytes.Length); stream.Close(); WebResponse wResponse = wRequest.GetResponse(); stream = wResponse.GetResponseStream(); StreamReader reader = new StreamReader(stream); String response = reader.ReadToEnd(); HttpWebResponse httpResponse = (HttpWebResponse)wResponse; string status = httpResponse.StatusCode.ToString(); reader.Close(); stream.Close(); wResponse.Close(); if (status != "OK") { result = string.Format("{0} {1}", httpResponse.StatusCode, httpResponse.StatusDescription); } return result; }
更多關於Android相關內容感興趣的讀者可查看本站專題:《Android編程之activity操作技巧總結》、《Android資源操作技巧匯總》、《Android文件操作技巧匯總》、《Android開發入門與進階教程》、《Android視圖View技巧總結》及《Android控件用法總結》
希望本文所述對大家Android程序設計有所幫助。
本文翻譯了這篇文章:Using the Android action bar (ActionBar) - Tutorial 1、ActionBar的簡介 ActionB
前幾個月剛接觸Android的時候做了一個小項目,其中也用到了類似刮刮樂的效果,現在把代碼貼出來 首先要做一個類似橡皮擦的東西吧,然後才能
項目地址:RingProgressBar簡介:一個簡單實現的自定義圓環進度條,可使用於文件的上傳下載圖片加載等地方.A material design circle th
C++ LooperLooperLooper類[system/core/libutils/Looper.cpp]提供了pollOnce(),wake()函數來完成睡眠等待