Android倚天劍之Notification之江南style


        上回我們提到在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.案例效果展示

 

 

 
五、創建大型文本樣式通知
1.案例代碼陳列
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.案例效果展示
 
六、創建大型圖片樣式通知
1.案例代碼陳列
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.案例效果展示
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM