Android Notification 詳解
前幾天專案中有用到 Android 通知相關的內容,索性把 Android Notification 相關的知識都看了一遍,稍作梳理,在此做個總結,以備不時之需。
溫故而知新,可以為師矣~
下圖是我對 Notification 做的思維導圖,也是本文的主要邏輯。 
本文主要講述 Notification 的基本操作部分,進階部分的內容還在學習ing~
Notification 概述
Notification,是一種具有全域性效果的通知,可以在系統的通知欄中顯示。當 APP 向系統發出通知時,它將先以圖示的形式顯示在通知欄中。使用者可以下拉通知欄檢視通知的詳細資訊。通知欄和抽屜式通知欄均是由系統控制,使用者可以隨時檢視。下面兩張圖均是來自 Google 官方文件。
 圖 1 .通知欄中的通知
 圖 2 .抽屜式通知欄中的通知
通知的目的是告知使用者 App 事件。在平時的使用中,通知主要有以下幾個作用:
- 顯示接收到短訊息、及時訊息等資訊(如QQ、微信、新浪、簡訊)
- 顯示客戶端的推送訊息,如廣告、優惠、版本更新、推薦新聞等,常用的第三方 SDK 有: JPush 、 個推 、 信鴿 、 網易雲信(偏重 IM ) 、 阿里雲推送
- 顯示正在進行的事物,例如:後臺執行的程式,如音樂播放進度、下載進度等
其中,前兩點可以歸結為與使用者互動,第三點是實時的任務提醒,但不可否認的是,第三點也會與使用者互動。
Notification 作為 Android 重要的使用者介面組成部分,它有自己的設計指南。在 Android 5.0(Api level 21) 中引入的
Notification 的概述就這麼多,接下去就開始講 Notification 的基本使用,中間會穿插 Notification 的基本 UI 、各個版本的區別、常見的通知效果以及自己在學習過程中踩到的坑。
Notification 的基本操作
Notification 的基本操作主要有建立、更新、取消這三種。一個 Notification 的必要屬性有三項,如果不設定則在執行時會丟擲異常:
- 小圖示,通過 setSmallIcon() 方法設定
- 標題,通過 setContentTitle() 方法設定
- 內容,通過 setContentText() 方法設定
除了以上三項,其它均為可選項。雖然如此,但還是應該給 Notification 設定一個 Action ,這樣就可以直接跳轉到 App 的某個 Activity 、啟動一個 Service 或者傳送一個 Broadcast。否則,Notification 僅僅只能起到通知的效果,而不能與使用者互動。
當系統接收到通知時,可以通過震動、響鈴、呼吸燈等多種方式進行提醒。
建立 Notification
Notification 的建立主要涉及到 Notification.Builder 、 Notification 、 NotificationManager 。
- Notification.Builer : 使用建造者模式構建 Notification 物件。由於 Notification.Builder 僅支援 Android 4.1及之後的版本,為了解決相容性問題, Google 在 Android Support v4 中加入了 NotificationCompat.Builder 類。對於某些在 Android 4.1 之後才特性,即使 NotificationCompat.Builder 支援該方法,在之前的版本中也不能執行。點我 檢視更多關於 Notification 相容性問題處理。文中使用的都是 NotificationCompat。
- Notification : 通知對應類,儲存通知相關的資料。NotificationManager 向系統傳送通知時會用到。
- NotificationManager : NotificationManager 是通知管理類,它是一個系統服務。呼叫 NotificationManager 的 notify() 方法可以向系統傳送通知。
獲取 NotificationManager 物件:
NotificationManager mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
前面講到,Notification 有三個必要屬性。下面,我們就來建立一個簡單的 Notification 。主要有以下三步:
- 獲取 NotificationManager 例項
- 例項化 NotificationCompat.Builder 並設定相關屬性
- 通過 builder.build() 方法生成 Notification 物件,併發送通知
private void sendNotification() {
//獲取NotificationManager例項
NotificationManager notifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//例項化NotificationCompat.Builde並設定相關屬性
NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
//設定小圖示
.setSmallIcon(R.mipmap.icon_fab_repair)
//設定通知標題
.setContentTitle("最簡單的Notification")
//設定通知內容
.setContentText("只有小圖示、標題、內容")
//設定通知時間,預設為系統發出通知的時間,通常不用設定
//.setWhen(System.currentTimeMillis());
//通過builder.build()方法生成Notification物件,併發送通知,id=1
notifyManager.notify(1, builder.build());
}
以上程式碼是對 Android 3.0 及之後的版本而言(包括使用 Support Library),對於 Android 3.0 之前的版本,主要使用 new Notification() 方法來建立 Notification 物件,本文不對此方式做任何講解,程式碼如下:
NotificationManager mNotifyMgr =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
PendingIntent contentIntent = PendingIntent.getActivity(
this, 0, new Intent(this, ResultActivity.class), 0);