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 {
		@Override
		protected Void doInBackground(String... params) {
			if (params[0] != null) {
				ArrayList nvp = new ArrayList();
				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 registration_ids { get; set; }
            public Dictionary 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() { receiverList },
                notification = new Dictionary
                {
                    {"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;
        }


你可能感兴趣的:(c#,编程,android)