Android 開發之 Notification 詳解

通知(Notification)的各種展現形式

通知展現位置

  1. 以圖標的形式顯示在通知區域中 
  2. 詳細信息展示在抽屜式通知欄中 
  3. 以浮動形式通知 
  4. 在鎖屏上展示通知 

通知展現樣式

  1. 標準樣式 
  2. 擴展樣式 
  3. 自定義樣式 

通知的基礎用法

創建通知

發送通知需要通過 NotificationManager.notify() 來實現,該函數的一個必要參數是 Notification 對象,Notification 對象描述了通知的具體內容,構建該對象需要利用 Notification.Builder 類,Notification.Builder 是 Android 3.0 (API 11) 引入的,爲了兼容低版本,我們一般使用 Support V4 包提供的 NotificationCompat.Builder 來構建 Notification。具體代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)

// 設置通知的基本信息:icon、標題、內容
builder.setSmallIcon(R.drawable.notification_icon)
builder.setContentTitle("My notification")
builder.setContentText("Hello World!");

// 設置通知的點擊行爲:這裏啓動一個 Activity
Intent intent = new Intent(this, ResultActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendingIntent);

// 發送通知 id 需要在應用內唯一
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(id, builder.build());

更新通知

要想更新通知,需要利用 NotificationManager.notify() 的 id 參數,該 id 在應用內需要唯一。要想更新特定 id 的通知,只需要創建新的 Notification,併發出與之前所用 id 相同的 Notification。如果之前的通知仍然可見,則系統會根據新的 Notification 對象的內容更新該通知。相反,如果之前的通知已被清除,系統則會創建一個新通知。

刪除通知

刪除通知可以有多種方式: 1. 通過 NotificationCompat.Builder 設置 setAutoCancel(true),這樣當用戶點擊通知後,通知自動刪除。 2. 通過 NotificationManager.cancel(id) 方法,刪除指定 id 的通知 3. 通過 NotificationManager.cancelAll() 方法,刪除該應用的所有通知

通知的進階用法

浮動通知

Android 5.0(API 21)引入浮動通知的展現形式,想讓通知能夠以浮動形式展現,需要設置 Notification 的優先級爲 PRIORITY_HIGH 或者 PRIORITY_MAX 並且使用鈴聲或振動,示例代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)

builder.setSmallIcon(R.drawable.notification_icon)
builder.setContentTitle("My notification")
builder.setContentText("Hello World!");
// 設置通知的優先級
builder.setPriority(NotificationCompat.PRIORITY_MAX);
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
// 設置通知的提示音
builder.setSound(alarmSound);

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(id, builder.build());

鎖屏上展示通知

Android 5.0 通知現在還可顯示在鎖定屏幕上。用戶可以通過“設置”選擇是否將通知顯示在鎖定屏幕上,並且您可以指定您應用中的通知在鎖定屏幕上是否可見。通過 setVisibility() 並指定以下值之一: 
1. VISIBILITY_PUBLIC 顯示通知的完整內容。 2. VISIBILITY_SECRET 不會在鎖定屏幕上顯示此通知的任何部分。 3. VISIBILITY_PRIVATE 顯示通知圖標和內容標題等基本信息,但是隱藏通知的完整內容。

設置 VISIBILITY_PRIVATE 後,您還可以提供其中隱藏了某些詳細信息的替換版本通知內容。例如,短信 應用可能會顯示一條通知,指出“您有 3 條新短信”,但是隱藏了短信內容和發件人。要提供此替換版本的通知,請先使用 NotificationCompat.Builder 創建替換通知。創建專用通知對象時,請通過 setPublicVersion() 方法爲其附加替換通知。

擴展樣式通知

通過 Builder.setStyle() 函數可以爲通知設置擴展樣式,NotificationCompat 提供了三種擴展樣式:BigPictureStyle, BigTextStyle, InboxStyle。

1
2
3
4
5
6
7
8
9
10
11
12
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)

builder.setSmallIcon(R.drawable.notification_icon)
builder.setContentTitle("My notification")
builder.setContentText("Hello World!");

NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
inboxStyle.setBigContentTitle("郵件標題:");
for (int i=0; i < 5; i++) {
    inboxStyle.addLine("郵件內容" + i);
}
builder.setStyle(inBoxStyle);

自定義通知佈局樣式

通過 NotificationCompat.setContent() 可以設置自定義佈局,該接口的參數爲 RemoteViews 類型,通過 xml 構建出需要顯示的 RemoteViews 然後調用 setContent 完成設置。自定義通知佈局的可用高度取決於通知視圖。普通視圖佈局限制爲 64 dp,擴展視圖佈局限制爲 256 dp。在 Android 4.1(API 16)以後,Notification 還支持大視圖的通知,通過 Notification.bigContentView 設置對應的 RemoteViews 即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
RemoteViews bigView;
RemoteViews smallView;

// 構建 bigView 和 smallView。
...

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);

// 設置自定義 RemoteViews
builder.setContent(smallView).setSmallIcon(R.drawable.icon_notification);
Notification notification = builder.build();

// 如果系統版本 >= Android 4.1,設置大視圖 RemoteViews
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
  notification.bigContentView = bigView;
}
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(DAILY_PUSH_NOTIFICATION_ID, notification);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章