1. 定义一个派生于WakefulBroadcastReceiver的类


public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {private static final String TAG = "GcmBroadcastReceiver";@Overridepublic 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");}@Overrideprotected 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 {@Overrideprotected 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;}@Overrideprotected 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;        }


更多相关文章

  1. Android 定义全局 ToastUtils
  2. Android通过PopupMenu定义弹出菜单的位置
  3. Android TV自定义通用标题栏(组合控件)
  4. 自定义对话框
  5. Android 自定义设置文本字体间间距
  6. Android ListFragment自定义view报错解决方案
  7. Android 自定义CheckBox 样式

随机推荐

  1. 带你一步步破解Android微信聊天记录解决
  2. Android3D游戏开发系列(2)色彩渲染和旋转
  3. Android高效率编码-细节,控件,架包,功能,工具
  4. FrameLayout 自定义字母导航条 android:l
  5. 开发5年,在资本寒冬下的 android开发者,该
  6. 做iOS开发程序员10个必需的开发工具和资
  7. Android(安卓)sqlite数据库操作通用框架A
  8. Android(安卓)网络连接——ConnectivityM
  9. Android高级工程师BAT面试题及知识点整理
  10. Android(安卓)主流开源框架(七)Glide 的缓