Android編程實(shí)現(xiàn)google消息通知功能示例
本文實(shí)例講述了Android編程實(shí)現(xiàn)google消息通知功能。分享給大家供大家參考,具體如下:
1. 定義一個(gè)派生于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);
}
}
}
服務(wù)器端(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;
}
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android資源操作技巧匯總》、《Android文件操作技巧匯總》、《Android開發(fā)入門與進(jìn)階教程》、《Android視圖View技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android中通過(guò)Notification&NotificationManager實(shí)現(xiàn)消息通知
- Android之開發(fā)消息通知欄
- Android消息通知欄的實(shí)現(xiàn)方法介紹
- Android自定義Notification添加點(diǎn)擊事件
- Android中AlarmManager+Notification實(shí)現(xiàn)定時(shí)通知提醒功能
- Android 中Notification彈出通知實(shí)現(xiàn)代碼
- Android編程使用Service實(shí)現(xiàn)Notification定時(shí)發(fā)送功能示例
- Android 通知使用權(quán)(NotificationListenerService)的使用
- android使用NotificationListenerService監(jiān)聽通知欄消息
- Android消息通知Notification常用方法(發(fā)送消息和接收消息)
相關(guān)文章
Android ViewPager實(shí)現(xiàn)輪播圖效果
這篇文章主要為大家詳細(xì)介紹了Android ViewPager實(shí)現(xiàn)輪播圖效果的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
Android開發(fā)環(huán)境搭建過(guò)程圖文詳解
這篇文章主要介紹了Android開發(fā)環(huán)境搭建過(guò)程圖文詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Android操作Excel文件的功能實(shí)現(xiàn)
本篇文章主要介紹了Android操作Excel文件的功能實(shí)現(xiàn),Android中操作Excel文件導(dǎo)出報(bào)表時(shí)主要采用開源庫(kù)jxl,有興趣的可以了解一下。2017-03-03
Windows下快速搭建安卓開發(fā)環(huán)境Android studio
這篇文章主要介紹了Windows下快速搭建安卓開發(fā)環(huán)境Android studio的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-07-07
Android系統(tǒng)添加自定義鼠標(biāo)樣式通過(guò)按鍵切換實(shí)例詳解
在本篇文章里小編給大家整理的是關(guān)于Android系統(tǒng)添加自定義鼠標(biāo)樣式通過(guò)按鍵切換實(shí)例詳解內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2019-11-11
Android實(shí)現(xiàn)Recycleview懸浮粘性頭部外加右側(cè)字母導(dǎo)航
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)Recycleview懸浮粘性頭部外加右側(cè)字母導(dǎo)航,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
如何使用Kotlin進(jìn)行Android開發(fā)
這篇文章主要教大家如何使用Kotlin進(jìn)行Android開發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05

