通知(Notification)的各種展現形式
通知展現位置
-
以圖標的形式顯示在通知區域中
-
詳細信息展示在抽屜式通知欄中
-
以浮動形式通知
-
在鎖屏上展示通知
通知展現樣式
-
標準樣式
-
擴展樣式
-
自定義樣式
通知的基礎用法
創建通知
發送通知需要通過 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);
|