上回我們提到在4.0ICS之后,Google為Android平台的Notification這把“倚天劍”注入了更多新鮮的元素,使其更加實用美觀。Notification的樣式從此變得豐富起來,以適應於不同情景的需要。就像最近非常流行的神曲《江南style》一樣,在世界各個角落出現了各種方言的版本,為不同膚色、民族、信仰的人們所接受和喜歡。本文我們就來耍耍這把“倚天劍”的各種style--各種樣式的通知。
一個通知就是一條消息,顯示在你的應用程序之外的界面(通知欄)。當你告知系統需要發布一個通知時,它首先作為一個icon出現在狀態欄區域。為了進一步了解它的細節,用戶可以下拉狀態欄展開至通知欄查看。

備注:除非特別注明以外,本文所提到的Builder均為v4 Support Library中NotificationCompat.Builder,它在4.0ICS之后才引入。而Notification.Builder引入於3.0HoneyComb。
一、通知視覺元素
通知有兩種可視化樣式,取決於版本和drawer的狀態:
標准視圖:在通知drawer中顯示標准視圖的通知。
大型視圖:當通知被展開時可以看到的一個大型視圖。該視圖也是擴展通知的一部分,該特征引入於4.1Jerry Bean。
1.正常視圖
一個出現在標准視圖中的通知,其高度是64dp。即使你使用大型視圖創建一個通知,它仍然出現在標准視圖中直至被展開。下面是一個正常視圖的范例:

“1”:內容標題,“2”:大型圖標,“3”:內容文本,“4”:內容附加,“5”:小型圖標,“6”:發布時間,可以使用setWhen()方法設置一個明確值。
2.大型視圖
大型視圖只有當通知被展開時才能出現,並且該通知必須位於通知drawer的頂部。用戶可以借助手勢(雙指水平滑動或垂直滑動)展開或合攏它。可擴展的通知這一特征引入於4.1Jerry Bean。下面是一個收件箱樣式的通知范例:

細心的讀者已經發現,大型視圖的視覺元素與正常視圖共享。不同之處在於“7”:通知細節區域。對於此區域的顯示內容,各種大型視圖通知有着不同的設置:
Big picture style:細節區域展現一個高度為256dp的bitmap。
Big text style:細節區域顯示一個大型文本塊。
Inbox style:細節區域包含文本行數。
另外,如下的兩個通知視覺元素僅支持大型視圖,所以采用標准視圖的請“靠邊站”^-^:
Big content title:允許你添加一個標題去覆蓋正常視圖的內容標題,但它只能出現在可擴展的視圖中。
Summary text:允許你在細節區域底端添加一行文本。
二、創建通知要素
你想在NotificationCompat.Builder對象中為通知指定UI信息和動作,就必須先使用NotificationCompat.Builder.build()方法來創建一個通知。該方法返回一個Notification對象,對了發布這個Notification對象,可以通過調用NotificationManager.notify()方法來傳遞它到系統中。
1.必選的通知內容
如下的三個通知視覺元素是必選的:
setSmallIcon():設置一個小型icon
setContentTitle():設置一個內容標題
setContentText():設置內容細節文本
2.可選的通知內容
除1所述的三個以外都是可選的^-^,詳情可參考API NotificationCompat.Builder類。
3.通知的動作
雖然動作是可選的,你應該至少添加一個動作到通知中。一個動作允許用戶從通知直接導航到應用程序的一個Activity中。在Activity中你將看到一個或更過的事件或是做進一步的工作。一個通知能夠提供多個動作。你應該總是能夠定義一個動作,當用戶點擊通知時觸發它。通常這個動作會幫你打開一個應用程序的Activity。在4.1Jerry Bean之后,你還可以在通知中添加按鈕來執行額外的動作(如:一個警告或即時響應的文本消息等)。前提是這些按鈕的功能在Activity中可用。
在一個通知里,其動作是通過一個含有能打開一個應用程序的Activity的意圖的PendingIntent對象來定義的。使用手勢附帶PendingIntent對象,再調用NotificationCompat.Builder對象中的合適方法。例如:當用戶在drawer中點擊通知文本的時候,如果你想要打開一個Activity,可以通過調用setContentIntent()方法來添加一個PendingIntent對象。
用戶點擊通知啟動一個Activity是最常見的情景。你也可以在用戶銷毀一個Activity的時候開啟一個Activity。但請注意的是只有在4.1Jerry Bean之后,才能在drawer中通過點擊一個按鈕來啟動一個Activity。欲知更多信息,可查閱NotificationCompat.Builder的相關指南。
4.兼容性處理
並不是所有通知的功能都能用於特定的版本。例如動作按鈕只能用於4.1Jerry Bean之后。因為只有從這個版本往后才有可展開的通知出現。為了確保達到最好的兼容性,請使用NotificationCompat及其子類創建通知,最好是NotificationCompat.Builder。此外,當你實現一個通知時,請遵循如下過程:
(1).無論用戶使用什么版本,都應該提供通知所有的功能給所有用戶。為了做到這一點,需要在一個Activity中驗證所有功能是否可用。有時候你可能需要添加一個新的Activity。例如:當你想調用addAction()方法來控制媒體停止和播放時,首先應該在一個Activity中實現這個功能。
(2).當用戶點擊通知時,確保所有用戶點擊后都能啟動一個界面。我們需要為Activity創建一個PendingIntent對象。然后調用setContentIntent()方法將PendingIntent對象添加到通知中去。
(3).現在可以在你想要使用的通知中添加可展開的特征。記住一點,當用戶點擊通知時,對於那些你想要添加到通知的功能,要保證它們在Activity中也是可用的。
三、創建標准樣式通知
1.案例代碼陳列
Notification normalNoti = new NotificationCompat.Builder(this)
.setAutoCancel(true) // 設置自動清除
.setContentInfo(String.valueOf(++normalNum)) // 設置附加內容
.setContentTitle("5 new messages") // 設置內容標題
.setContentText("lynnli1229@gmail.com") // 設置內容文本
.setDefaults(Notification.DEFAULT_ALL) // 設置使用所有默認值(聲音、震動、閃屏等)
.setLargeIcon(icon) // 設置大型圖標
.setSmallIcon(R.drawable.stat_notify_gmail) // 設置小型圖標
.setTicker("Normal Notification") // 設置狀態欄提示信息
.build();
2.案例效果展示

四、創建收件箱樣式通知
1.案例代碼陳列
Notification inboxNoti = new NotificationCompat.Builder(this)
.setAutoCancel(true)
.setContentInfo(String.valueOf(++inboxNum))
.setContentTitle("5 new mails")
.setContentText("lynnli1229@gmail.com")
.setDefaults(Notification.DEFAULT_ALL)
.setLargeIcon(icon)
.setSmallIcon(R.drawable.stat_notify_gmail)
.setTicker("Inbox Notification")
.setStyle(new NotificationCompat.InboxStyle() // 設置通知樣式為收件箱樣式
.addLine("M.Lynn reminder")
.addLine("M.Lynn launch")
.addLine("M.Lynn hello")
.setSummaryText("+3 more")) // 設置在細節區域底端添加一行文本
.build();
2.案例效果展示
Notification bigtextNoti = new NotificationCompat.Builder(this)
.setAutoCancel(true)
.setContentInfo(String.valueOf(++bigtextNum))
.setContentTitle("New mail")
.setContentText("lynnli1229@gmail.com")
.setDefaults(Notification.DEFAULT_ALL)
.setLargeIcon(icon)
.setSmallIcon(R.drawable.stat_notify_gmail)
.setTicker("BigText Notification")
.setStyle(new NotificationCompat.BigTextStyle() // 設置通知樣式為大型文本樣式
.bigText("Helper class for generating large-format notifications that include a lot of text. This class is a \"rebuilder\": It attaches to a Builder object and modifies its behavior, like so."))
.build(); 2.案例效果展示
Notification bigpictureNoti = new NotificationCompat.Builder(this)
.setAutoCancel(true)
.setContentInfo(String.valueOf(++bigpictureNum))
.setContentTitle("New photo")
.setContentText("lynnli1229@gmail.com")
.setDefaults(Notification.DEFAULT_ALL)
.setLargeIcon(icon)
.setSmallIcon(R.drawable.stat_notify_gmail)
.setTicker("BigPicture Notification")
.setStyle(new NotificationCompat.BigPictureStyle() // 設置通知樣式為大型圖片樣式
.bigPicture(BitmapFactory.decodeResource(getResources(), R.drawable.fantasy)))
.build(); 2.案例效果展示
