怎么在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中利用google实现一个消息通知功能的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。