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;
}