什麼是通知(Notification)
通知是一個可以在應用程序正常的用戶界面之外顯示給用戶的消息。
通知發出時,它首先出現在狀態欄的通知區域中,用戶打開通知抽屜可查看通知詳情。通知區域和通知抽屜都是用戶可以隨時查看的系統控制區域。
作爲安卓用戶界面的重要組成部分,通知有自己的設計指南。在Android 5.0(API level 21)中引入的 Material Design 的變化是特別重要的,更多信息請閱讀 通知設計指南。
如何創建通知
隨着Android系統不斷升級,Notification的創建方式也隨之變化,主要變化如下:
Android 3.0之前
Android 3.0 (API level 11)之前,使用new
Notification()
方式創建通知:
Android 3.0 (API level 11)及更高版本
Android 3.0開始棄用new
Notification()
方式,改用Notification.Builder()
來創建通知:
這裏需要注意: "build()" 是Androdi 4.1(API level 16)加入的,用以替代
"getNotification()"。API level 16開始棄用"getNotification()"
兼容Android 3.0之前的版本
爲了兼容API
level 11
之前的版本,v4
Support Library
中提供了NotificationCompat.Builder()
這個替代方法。它與Notification.Builder()
類似,二者沒有太大區別。
注:除特別說明外,本文將根據 NotificationCompat.Builder() 展開解析,
Notification.Builder()類似。
通知基本用法
通知的必要屬性
一個通知必須包含以下三項屬性:
-
小圖標,對應 setSmallIcon()
-
通知標題,對應 setContentTitle()
-
詳細信息,對應 setContentText()
其他屬性均爲可選項,更多屬性方法請參考NotificationCompat.Builder。
儘管其他都是可選的,但一般都會爲通知添加至少一個動作(Action),這個動作可以是跳轉到Activity、啓動一個Service或發送一個Broadcas等。 通過以下方式爲通知添加動作:
-
使用PendingIntent
-
通過大視圖通知的 Action Button //僅支持Android 4.1 (API level 16)及更高版本,稍後會介紹
創建通知
1、實例化一個NotificationCompat.Builder對象
NotificationCompat.Builder自動設置的默認值:
-
priority: PRIORITY_DEFAULT
-
when: System.currentTimeMillis()
-
audio stream: STREAM_DEFAULT
2、定義並設置一個通知動作(Action)
3、生成Notification
對象
Notificatioin notification = mBuilder.build();
4、使用NotificationManager
發送通知
更新通知
更新通知很簡單,只需再次發送相同ID的通知即可,如果之前的通知依然存在則會更新通知屬性,如果之前通知不存在則重新創建。
示例代碼:
取消通知
取消通知有如下4種方式:
-
點擊通知欄的清除按鈕,會清除所有可清除的通知
-
設置了 setAutoCancel() 或 FLAG_AUTO_CANCEL的通知,點擊該通知時會清除它
-
通過 NotificationManager 調用 cancel() 方法清除指定ID的通知
-
通過 NotificationManager 調用 cancelAll() 方法清除所有該應用之前發送的通知
通知類型
大視圖通知
通知有兩種視圖:普通視圖和大視圖。
普通視圖:
大視圖:
默認情況下爲普通視圖,可通過NotificationCompat.Builder.setStyle()
設置大視圖。
注: 大視圖(Big Views)由Android 4.1(API level 16)開始引入,且僅支持Android 4.1及更高版本。
構建大視圖通知
以上圖爲例:
1、構建Action Button的PendingIntent
2、構建NotificatonCompat.Builder對象
3、其他步驟與普通視圖相同
進度條通知
-
明確進度的進度條
使用setProgress(max, progress, false)
來更新進度。
max: 最大進度值
progress: 當前進度
false: 是否是不明確的進度條模擬下載過程,示例如下:
上圖,分別爲下載過程中進度條通知 和 下載完成移除進度條後的通知。 -
不確定進度的進度條
使用setProgress(0, 0, true)
來表示進度不明確的進度條mBuilder.setProgress(0, 0, true); mNotifyManager.notify(id, mBuilder.build());
浮動通知(Heads-up Notifications)
Android 5.0(API level 21)開始,當屏幕未上鎖且亮屏時,通知可以以小窗口形式顯示。用戶可以在不離開當前應用前提下操作該通知。
如圖:
以下兩種情況會顯示浮動通知:
-
setFullScreenIntent(),如上述示例。
-
通知擁有高優先級且使用了鈴聲和振動
鎖屏通知
Android 5.0(API level 21)開始,通知可以顯示在鎖屏上。用戶可以通過設置選擇是否允許敏感的通知內容顯示在安全的鎖屏上。
你的應用可以通過setVisibility()
控制通知的顯示等級:
-
VISIBILITY_PRIVATE : 顯示基本信息,如通知的圖標,但隱藏通知的全部內容
-
VISIBILITY_PUBLIC : 顯示通知的全部內容
-
VISIBILITY_SECRET : 不顯示任何內容,包括圖標
自定義通知
Android系統允許使用RemoteViews來自定義通知。
自定義普通視圖通知高度限制爲64dp,大視圖通知高度限制爲256dp。同時,建議自定義通知儘量簡單,以提高兼容性。
自定義通知需要做如下操作:
1、創建自定義通知佈局
2、使用RemoteViews定義通知組件,如圖標、文字等
3、調用setContent()
將RemoteViews對象綁定到NotificationCompat.Builder
4、同正常發送通知流程
注意: 避免爲通知設置背景,因爲兼容性原因,有些文字可能看不清。
定義通知文本樣式
通知的背景顏色在不同的設備和版本中有所不同,Android2.3開始,系統定義了一套標準通知文本樣式,建議自定義通知使用標準樣式,這樣有助於通知文本可見。
通知文本樣式:
更多通知的標準樣式和佈局,可參考源碼frameworks/base/core/res/res/layout
路徑下的通知模版如:
保留Activity返回棧
常規Activity
默認情況下,從通知啓動一個Activity,按返回鍵會回到主屏幕。但某些時候有按返回鍵仍然留在當前應用的需求,這就要用到TaskStackBuilder
了。
1、在manifest中定義Activity的關係
2、創建返回棧PendingIntent
上述操作後,從通知啓動ResultActivity,按返回鍵會回到MainActivity,而不是主屏幕。
特殊Activity
默認情況下,從通知啓動的Activity會在近期任務列表裏出現。如果不需要在近期任務裏顯示,則需要做以下操作:
1、在manifest中定義Activity
2、構建PendingIntent
上述操作後,從通知啓動ResultActivity,此Activity不會出現在近期任務列表中。
通知常見屬性和常量
通知的提醒方式
1、聲音提醒
-
默認聲音
notification.defaults |= Notification.DEFAULT_SOUND; -
自定義聲音
notification.sound = Uri.parse("file:///sdcard0/notification.ogg");
2、震動提醒
-
默認振動
notification.defaults |= Notification.DEFAULT_VIBRATE; -
自定義振動
long[] vibrate = {100, 200, 300, 400}; //震動效果
// 表示在100、200、300、400這些時間點交替啓動和關閉震動 notification.vibrate = vibrate;
3、閃爍提醒
-
默認閃爍
notification.defaults |= Notification.DEFAULT_LIGHTS; -
自定義閃爍
notification.ledARGB = 0xff00ff00; // LED燈的顏色,綠燈
notification.ledOnMS = 300; // LED燈顯示的毫秒數,300毫秒
notification.ledOffMS = 1000; // LED燈關閉的毫秒數,1000毫秒
notification.flags |= Notification.FLAG_SHOW_LIGHTS; // 必須加上這個標誌
常見的Flags
-
FLAG_AUTO_CANCEL
當通知被用戶點擊之後會自動被清除(cancel) -
FLAG_INSISTENT
在用戶響應之前會一直重複提醒音 -
FLAG_ONGOING_EVENT
表示正在運行的事件 -
FLAG_NO_CLEAR
通知欄點擊“清除”按鈕時,該通知將不會被清除 -
FLAG_FOREGROUND_SERVICE
表示當前服務是前臺服務
更多Notification屬性詳見Notification。
That's all! 更多通知知識點等待你來發掘,歡迎補充!
參考資料
Notifications