本文為原創,如需轉載,請註明作者和出處,謝謝!
Notification與Toast都可以起到通知、提醒的作用。但它們的實現原理和表現形式卻完全不一樣。Toast其實相當於一個組件(Widget)。有些類似於沒有按鈕的對話 框。而Notification是顯示在螢幕上方狀態列中的資訊。還有就是Notification需要用NotificationManager來管理,而Toast只需要簡單地建立Toast對象即可。
下面來看一下建立並顯示一個Notification的步驟。建立和顯 示一個Notification需要如下5步:
1. 通過getSystemService方法獲得一個NotificationManager對象。
2. 建立一個Notification對象。每一個Notification對應一個Notification對象。在這一步需要設定顯示在螢幕上方狀態列的通知訊息、通知訊息前方的映像資源ID和發出通知的時間。一般為目前時間。
3. 由於Notification可以與應用程式脫離。也就是說,即使應用程式被關閉,Notification仍然會顯示在狀態列 中。當應用程式再次啟動後,又可以重新控制這些Notification。如清除或替換它們。因此,需要建立一個PendingIntent對象。該對象由Android系統負責維護,因此,在應用程式關閉後,該對象仍然不會被釋放。
4. 使用Notification類的setLatestEventInfo方法設定Notification的詳細資料。
5. 使用NotificationManager類的notify方法顯示Notification訊息。在這一步需要指定標識Notification的唯一ID。這個ID必須相對於同一個NotificationManager對象是唯一的,否則就會覆蓋相同ID的Notificaiton。
心動不如行動,下面我們來演練一下如何在狀 態欄顯示一個Notification,代碼如下:
// 第1步
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, "天氣預報", "晴 轉多雲", contentIntent);
// 第5步
notificationManager.notify(R.drawable.icon, notification);
下面的代碼使用showNotification方法顯示了3個Notification訊息。
showNotification("今 天非常高興", "今天考試得了全年級第一",
"數學100分、語文99分、英語100分,yeah!", R.drawable.smile, R.drawable.smile);
showNotification("這是為什麼呢?", "這 道題為什麼會出錯呢?", "誰有正確答案啊.",
R.drawable.why, R.drawable.why);
showNotification("今天心情不好", "也 不知道為什麼,這幾天一直很鬱悶.", "也許應該去公園散心了",
R.drawable.why, R.drawable.wrath);
其中第2個和第3個Notification使用的是同一個ID(R.drawabgle.why),因此,第3個Notification會覆蓋第2個Notification。
在顯示Notification時還可以設定顯示通 知時的預設發聲、震動和Light效果。要實現這個功能需要設定Notification類的defaults屬性,代碼如下:
notification.defaults = Notification.DEFAULT_SOUND; // 使用預設的聲音
notification.defaults = Notification.DEFAULT_VIBRATE; // 使用預設的震動
notification.defaults = Notification.DEFAULT_LIGHTS; // 使用預設的Light
notification.defaults = Notification.DEFAULT_ALL; // 所有的都使用預設值
注意:設定預設發聲、震動和Light的方法是setDefaults。該 方法與showNotification方法的實現代碼基本相同,只是在調用notify方法之前需要設定defaults屬性(defaults屬性必須在 調用notify方法之前調用,否則不起作用)。在設定預設震動效果時還需要在AndroidManifest.xml檔案中通過<uses-permission>標籤設定android.permission.VIBRATE許可權。
如果要清除某個訊息,可以使用NotificationManager類 的cancel方 法,該方法只有一個參數,表示要清除的Notification的ID。使用cancelAll可以清除當前NotificationManager對象中的所有Notification。
運行本節的例子,單擊螢幕上顯示Notification的按鈕,會顯示如 圖1所示的訊息。每一個訊息會顯示一會,然後就只顯示整個Android系統(也包括其他應用程式) 的Notification(只顯示映像部分)。2所示。如果將狀態列拖下來,可以看 到Notification的詳細資料和發出通知的時間(也就是Notification類的構造方法的第3個參數值),3所 示。當單擊【清除通知】按鈕,會清除本應用程式顯示的所有Notification,清除後的效果4所示。
圖1
圖2
圖3
圖4