Android实现google消息通知
16lz
2021-01-23
1. 定义一个派生于WakefulBroadcastReceiver的类
2. 用于处理broadcast消息的类
服务器端(C#):
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; }
更多相关文章
- Android 定义全局 ToastUtils
- Android通过PopupMenu定义弹出菜单的位置
- Android TV自定义通用标题栏(组合控件)
- 自定义对话框
- Android 自定义设置文本字体间间距
- Android ListFragment自定义view报错解决方案
- Android 自定义CheckBox 样式