1. 程式人生 > >Android Notification 詳解

Android Notification 詳解

前幾天專案中有用到 Android 通知相關的內容,索性把 Android Notification 相關的知識都看了一遍,稍作梳理,在此做個總結,以備不時之需。

溫故而知新,可以為師矣~

下圖是我對 Notification 做的思維導圖,也是本文的主要邏輯。 Android Notification

本文主要講述 Notification 的基本操作部分,進階部分的內容還在學習ing~

Notification 概述

Notification,是一種具有全域性效果的通知,可以在系統的通知欄中顯示。當 APP 向系統發出通知時,它將先以圖示的形式顯示在通知欄中。使用者可以下拉通知欄檢視通知的詳細資訊。通知欄和抽屜式通知欄均是由系統控制,使用者可以隨時檢視。下面兩張圖均是來自 Google 官方文件。

notification_area 圖 1 .通知欄中的通知

notification_drawe 圖 2 .抽屜式通知欄中的通知

通知的目的是告知使用者 App 事件。在平時的使用中,通知主要有以下幾個作用:

  1. 顯示接收到短訊息、及時訊息等資訊(如QQ、微信、新浪、簡訊)
  2. 顯示客戶端的推送訊息,如廣告、優惠、版本更新、推薦新聞等,常用的第三方 SDK 有: JPush個推信鴿網易雲信(偏重 IM )阿里雲推送
  3. 顯示正在進行的事物,例如:後臺執行的程式,如音樂播放進度、下載進度等

其中,前兩點可以歸結為與使用者互動,第三點是實時的任務提醒,但不可否認的是,第三點也會與使用者互動。

Notification 作為 Android 重要的使用者介面組成部分,它有自己的設計指南。在 Android 5.0(Api level 21) 中引入的

Material Design 尤為重要。關於 Notification 的設計指南請參考 Notification Pattern

Notification 的概述就這麼多,接下去就開始講 Notification 的基本使用,中間會穿插 Notification 的基本 UI 、各個版本的區別、常見的通知效果以及自己在學習過程中踩到的坑。

Notification 的基本操作

Notification 的基本操作主要有建立、更新、取消這三種。一個 Notification 的必要屬性有三項,如果不設定則在執行時會丟擲異常:

  1. 小圖示,通過 setSmallIcon() 方法設定
  2. 標題,通過 setContentTitle() 方法設定
  3. 內容,通過 setContentText() 方法設定

除了以上三項,其它均為可選項。雖然如此,但還是應該給 Notification 設定一個 Action ,這樣就可以直接跳轉到 App 的某個 Activity 、啟動一個 Service 或者傳送一個 Broadcast。否則,Notification 僅僅只能起到通知的效果,而不能與使用者互動。

當系統接收到通知時,可以通過震動、響鈴、呼吸燈等多種方式進行提醒。

建立 Notification

Notification 的建立主要涉及到 Notification.BuilderNotificationNotificationManager

  1. Notification.Builer : 使用建造者模式構建 Notification 物件。由於 Notification.Builder 僅支援 Android 4.1及之後的版本,為了解決相容性問題, Google 在 Android Support v4 中加入了 NotificationCompat.Builder 類。對於某些在 Android 4.1 之後才特性,即使 NotificationCompat.Builder 支援該方法,在之前的版本中也不能執行。點我 檢視更多關於 Notification 相容性問題處理。文中使用的都是 NotificationCompat。
  2. Notification : 通知對應類,儲存通知相關的資料。NotificationManager 向系統傳送通知時會用到。
  3. NotificationManager : NotificationManager 是通知管理類,它是一個系統服務。呼叫 NotificationManager 的 notify() 方法可以向系統傳送通知。

獲取 NotificationManager 物件:

NotificationManager mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

前面講到,Notification 有三個必要屬性。下面,我們就來建立一個簡單的 Notification 。主要有以下三步:

  1. 獲取 NotificationManager 例項
  2. 例項化 NotificationCompat.Builder 並設定相關屬性
  3. 通過 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);