IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]Android实现google消息通知

    csharp25发表于 2017-04-16 20:40:18
    love 0
    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;
            }




沪ICP备19023445号-2号
友情链接