《Android/OPhone開發(fā)完全講義》連載(5):Notification與狀態(tài)欄信息
本文為新書《Android/OPhone 開發(fā)完全講義》的內(nèi)容連載。《Android/OPhone開發(fā)完全講義》一書現(xiàn)已出版,敬請(qǐng)關(guān)注。
購 買:
互動(dòng)網(wǎng)(china- pub)
當(dāng)當(dāng)(dangdang)
卓越亞馬遜
《Android/OPhone開發(fā)完全講義》目錄

上一篇:Android SDK中常用命令行工具(二)
Notification與Toast都可以起到通知、提醒的作用。但它們的實(shí)現(xiàn)原理和表現(xiàn)形式卻完全不一樣。Toast其實(shí)相當(dāng)于一個(gè)組件(Widget)。有些類似于沒有按鈕的對(duì)話框。而Notification是顯示在屏幕上方狀態(tài)欄中的信息。還有就是Notification需要用NotificationManager來管理,而Toast只需要簡(jiǎn)單地創(chuàng)建Toast對(duì)象即可。
下面來看一下創(chuàng)建并顯示一個(gè)Notification的步驟。創(chuàng)建和顯示一個(gè)Notification需要如下5步:
1. 通過getSystemService方法獲得一個(gè)NotificationManager對(duì)象。
2. 創(chuàng)建一個(gè)Notification對(duì)象。每一個(gè)Notification對(duì)應(yīng)一個(gè)Notification對(duì)象。在這一步需要設(shè)置顯示在屏幕上方狀態(tài)欄的通知消息、通知消息前方的圖像資源ID和發(fā)出通知的時(shí)間。一般為當(dāng)前時(shí)間。
3. 由于Notification可以與應(yīng)用程序脫離。也就是說,即使應(yīng)用程序被關(guān)閉,Notification仍然會(huì)顯示在狀態(tài)欄中。當(dāng)應(yīng)用程序再次啟動(dòng)后,又可以重新控制這些Notification。如清除或替換它們。因此,需要?jiǎng)?chuàng)建一個(gè)PendingIntent對(duì)象。該對(duì)象由Android系統(tǒng)負(fù)責(zé)維護(hù),因此,在應(yīng)用程序關(guān)閉后,該對(duì)象仍然不會(huì)被釋放。
4. 使用Notification類的setLatestEventInfo方法設(shè)置Notification的詳細(xì)信息。
5. 使用NotificationManager類的notify方法顯示Notification消息。在這一步需要指定標(biāo)識(shí)Notification的唯一ID。這個(gè)ID必須相對(duì)于同一個(gè)NotificationManager對(duì)象是唯一的,否則就會(huì)覆蓋相同ID的Notificaiton。
心動(dòng)不如行動(dòng),下面我們來演練一下如何在狀態(tài)欄顯示一個(gè)Notification,代碼如下:
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// 第2步
Notification notification = new Notification(R.drawable.icon, "您有新消息了", System.currentTimeMillis());
// 第3步
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, getIntent(), 0);
// 第4步
notification.setLatestEventInfo(this, "天氣預(yù)報(bào)", "晴轉(zhuǎn)多云", contentIntent);
// 第5步
notificationManager.notify(R.drawable.icon, notification);
上面的5行代碼正好對(duì)應(yīng)創(chuàng)建和顯示Notification的5步。在這里要解釋一下的是notify方法的第1個(gè)參數(shù)。這個(gè)參數(shù)實(shí)際上表示了Notification的ID。是一個(gè)int類型的值。為了使這個(gè)值唯一,可以使用res目錄中的某些資源ID。例如,在上面的代碼中使用了當(dāng)前Notification顯示的圖像對(duì)應(yīng)的資源ID(R.drawable.icon)作為Notification的ID。當(dāng)然,讀者也可以使用其他的值作為Notification的ID值。
由于創(chuàng)建和顯示多個(gè)Notification的代碼類似,因此,在本節(jié)的例子中編寫了一個(gè)showNotification方法來顯示Notification,代碼如下:
{
Notification notification = notification = new Notification(resId, tickerText, System.currentTimeMillis());
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, getIntent(), 0);
notification.setLatestEventInfo(this, contentTitle, contentText, contentIntent);
// notificationManager是在類中定義的NotificationManager變量。在onCreate方法中已經(jīng)創(chuàng)建
notificationManager.notify(id, notification);
}
下面的代碼使用showNotification方法顯示了3個(gè)Notification消息。
"數(shù)學(xué)100分、語文99分、英語100分,yeah!", R.drawable.smile, R.drawable.smile);
showNotification("這是為什么呢?", "這道題為什么會(huì)出錯(cuò)呢?", "誰有正確答案啊.",
R.drawable.why, R.drawable.why);
showNotification("今天心情不好", "也不知道為什么,這幾天一直很郁悶.", "也許應(yīng)該去公園散心了",
R.drawable.why, R.drawable.wrath);
在顯示Notification時(shí)還可以設(shè)置顯示通知時(shí)的默認(rèn)發(fā)聲、震動(dòng)和Light效果。要實(shí)現(xiàn)這個(gè)功能需要設(shè)置Notification類的defaults屬性,代碼如下:
notification.defaults = Notification.DEFAULT_VIBRATE; // 使用默認(rèn)的震動(dòng)
notification.defaults = Notification.DEFAULT_LIGHTS; // 使用默認(rèn)的Light
notification.defaults = Notification.DEFAULT_ALL; // 所有的都使用默認(rèn)值
如果要清除某個(gè)消息,可以使用NotificationManager類的cancel方法,該方法只有一個(gè)參數(shù),表示要清除的Notification的ID。使用cancelAll可以清除當(dāng)前NotificationManager對(duì)象中的所有Notification。
運(yùn)行本節(jié)的例子,單擊屏幕上顯示Notification的按鈕,會(huì)顯示如圖1所示的消息。每一個(gè)消息會(huì)顯示一會(huì),然后就只顯示整個(gè)Android系統(tǒng)(也包括其他應(yīng)用程序)的Notification(只顯示圖像部分)。如圖2所示。如果將狀態(tài)欄拖下來,可以看到Notification的詳細(xì)信息和發(fā)出通知的時(shí)間(也就是Notification類的構(gòu)造方法的第3個(gè)參數(shù)值),如圖3所示。當(dāng)單擊【清除通知】按鈕,會(huì)清除本應(yīng)用程序顯示的所有Notification,清除后的效果如圖4所示。
圖1
圖2
圖3
圖4
下一篇:為TextView組件加上邊框
《Android開發(fā)完全講義(第2版)》(本書版權(quán)已輸出到臺(tái)灣)
http://product.dangdang.com/product.aspx?product_id=22741502
《Android高薪之路:Android程序員面試寶典 》http://book.360buy.com/10970314.html
新浪微博:http://t.sina.com.cn/androidguy 昵稱:李寧_Lining
posted on 2010-07-13 08:20 銀河使者 閱讀(2710) 評(píng)論(0) 編輯 收藏 所屬分類: java 、 原創(chuàng) 、移動(dòng)(mobile) 、Android/OPhone