Android Notification 詳解

Link: www.jianshu.com/p/d2051a785…
Demo: github.com/czy1121/Not… html

1. 簡單用法

建立通知java

建立通知至少包含 小圖標、標題、內容 才能顯示android

NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!");複製代碼

發送通知git

NotificationManager manager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(notifyId, builder.build());複製代碼

取消通知github

NotificationManager manager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);

// 取消notifyId關聯的通知
manager.cancel(notifyId);

// 取消全部通知
manager.cancelAll();複製代碼

2. 基本信息

標題/內容/小圖標api

必要信息併發

// 標題
builder.setContentTitle("這是通知標題");
// 內容
builder.setContentText("這是通知內容");
// 小圖標
builder.setSmallIcon(R.mipmap.ic_small_icon);複製代碼

大圖標app

大圖標,未設置時使用小圖標代替ide

// 大圖標 
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_large_icon);
builder.setLargeIcon(bitmap);複製代碼

次要內容 佈局

setContentInfo 在 api 24 被廢棄,再也不顯示,用 setSubText 代替
setNumber 在 api 24 被廢棄,再也不顯示

// 次要內容
builder.setSubText("這是通知的次要內容");
// 附加文本
builder.setContentInfo("INFO");
// 附加數字,等價於 setContentInfo, 爲了顯示效果用一個不一樣的字體尺寸顯示數字
builder.setNumber(123);複製代碼

時間

setShowWhen 在 api 17 被添加
setChronometerCountDown 在 api 24 添加

// 設置時間
builder.setWhen(System.currentTimeMillis())
// 設置是否顯示時間
builder.setShowWhen(false);
// 設置是否顯示時鐘表示時間(count up)
builder.setUsesChronometer(false););
// 設置時鐘是否爲倒計時(count down)
builder.setChronometerCountDown(false);複製代碼

進度條

當使用了 setSubText() 後,進度條將不顯示
api 24 以後,setSubText() 再也不影響進度條

int max = 100; // 進度最大值
int progress = 50;  // 當前進度
int indeterminate = false; // 是不是不明確的進度條
builder.setProgress(max, progress, indeterminate);複製代碼

狀態欄摘要(ticker)

在 api 21 後再也不顯示,僅用於輔助服務。

builder.setTicker("this is ticker");複製代碼

3. 標誌符(Flags)

Flag 描述
Notification.FLAG_SHOW_LIGHTS 是否使用呼吸燈提醒
Notification.FLAG_INSISTENT 持續提醒(聲音/振動)直到用戶響應(點擊/取消)
Notification.FLAG_ONLY_ALERT_ONCE 提醒(鈴聲/震動/滾動通知摘要)只執行一次
Notification.FLAG_ONGOING_EVENT 正在進行中通知
Notification.FLAG_AUTO_CANCEL 用戶點擊通知後自動取消
Notification.FLAG_NO_CLEAR 用戶沒法取消
Notification.FLAG_FOREGROUND_SERVICE 表示正在運行的服務

設置是否使用呼吸燈提醒(FLAG_SHOW_LIGHTS)

經過 builder.setLightsbuilder.setDefaults 設置使用呼吸燈時會自動添加 FLAG_SHOW_LIGHTS

設置提醒只執行一次(FLAG_ONLY_ALERT_ONCE)

設置提醒只執行一次

builder.setOnlyAlertOnce(true);複製代碼

設置自動取消(FLAG_AUTO_CANCEL)

須要同時設置了 setContentIntent() 纔有效

builder.setAutoCancel(true);
builder.setContentIntent(pendingIntent);複製代碼

設置通知爲進行中(FLAG_ONGOING_EVENT)

一般表示一個用戶積極參與的後臺任務,好比電話,下載,播放音樂等

用戶不能取消,效果相似FLAG_NO_CLEAR
用戶點擊通知且設置了自動取消時會被刪除

builder.setOngoing(true);複製代碼

設置 FLAG_INSISTENT/FLAG_NO_CLEAR

NotificationCompat.Builder 未提供設置方法,只能經過 Notification

Notification n = builder.build();
// 持續提醒直到用戶響應
n.flags |= Notification.FLAG_INSISTENT;
// 用戶沒法取消
n.flags |= Notification.FLAG_NO_CLEAR;
manager.notify(notifyId, n);複製代碼

4. 優先級

優先級 描述
Notification.PRIORITY_MAX 重要而緊急的通知,通知用戶這個事件是時間上緊迫的或者須要當即處理的。
Notification.PRIORITY_HIGH 高優先級用於重要的通訊內容,例如短消息或者聊天,這些都是對用戶來講比較有興趣的
Notification.PRIORITY_DEFAULT 默認優先級用於沒有特殊優先級分類的通知
Notification.PRIORITY_LOW 低優先級能夠通知用戶但又不是很緊急的事件。只顯示狀態欄圖標
Notification.PRIORITY_MIN 用於後臺消息 (例如天氣或者位置信息)。只有用戶下拉通知抽屜才能看到內容

設置優先級

builder.setPriority(Notification.PRIORITY_HIGH);複製代碼

5. 提醒通知到達

提供了 鈴聲/振動/呼吸燈 三種提醒方式,可使用一種或同時使用多種

使用默認提醒

FLAG 描述
Notification.DEFAULT_SOUND 添加默認聲音提醒
Notification.DEFAULT_VIBRATE 添加默認震動提醒
Notification.DEFAULT_LIGHTS 添加默認呼吸燈提醒
Notification.DEFAULT_ALL 同時添加以上三種默認提醒
// 添加默認聲音提醒
builder.setDefaults(Notification.DEFAULT_SOUND);

// 添加默認呼吸燈提醒,自動添加FLAG_SHOW_LIGHTS
builder.setDefaults(Notification.DEFAULT_LIGHTS);複製代碼

添加自定義提醒

// 添加自定義聲音提醒
builder.setSound(Uri.parse("path/to/sound"));

// 添加自定義震動提醒
// 延遲200ms後震動300ms,再延遲400ms後震動500ms
long[] pattern = new long[]{200,300,400,500}; 
builder.setVibrate(pattern);

// 添加自定義呼吸燈提醒,自動添加FLAG_SHOW_LIGHTS
int argb = 0xffff0000;  // led燈光顏色
int onMs = 300;         // led亮燈持續時間
int offMs = 100;        // led熄燈持續時間
builder.setLights(argb, onMs, offMs);複製代碼

6. 事件

點擊內容事件

int flags = PendingIntent.FLAG_UPDATE_CURRENT;
Intent intent = new Intent(this, ResultActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, flags);
builder.setContentIntent(pi);複製代碼

取消通知事件

通知被用戶取消時發送(清除全部,右滑刪除)
「自動取消(FLAG_AUTO_CANCEL)」不會產生該事件

Intent intent = new Intent(ACTION);
intent.putExtra("op", op);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0);
builder.setDeleteIntent(pi);複製代碼

全屏通知事件

響應緊急事件(好比來電)

Intent intent = new Intent(ACTION);
intent.putExtra("op", op);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0);
builder.setFullScreenIntent(pi, true);複製代碼

7. 浮動通知

Android 5.0(API 21)開始支持浮動通知

設備處於活動狀態(設備未鎖定且其屏幕已打開)時,可顯示浮動通知

知足下列條件之一可觸發浮動通知:

  • 用戶的 Activity 處於全屏模式中(應用使用 fullScreenIntent)
  • 通知具備較高的優先級(PRIORITY_MAX 或 PRIORITY_HIGH)並使用鈴聲或振動

注:國內各類ROM可能因爲各類緣由致使浮動通知不能顯示

8. 鎖定屏幕通知

Android 5.0(API 21)開始,通知可顯示在鎖定屏幕上。
可以使用此功能提供媒體播放控件以及其餘經常使用操做。
用戶能夠經過「設置」選擇是否將通知顯示在鎖定屏幕上。

設置可見性

  • VISIBILITY_PUBLIC 顯示通知的完整內容。
  • VISIBILITY_SECRET 不會在鎖定屏幕上顯示此通知的任何部分。
  • VISIBILITY_PRIVATE 顯示通知圖標和內容標題等基本信息,可是隱藏通知的完整內容。

設置 VISIBILITY_PRIVATE 後,還能夠經過 setPublicVersion() 提供其中隱藏了某些詳細信息的替換版本通知內容。

9. 擴展布局

Android 4.1(API 16) 開始支持擴展布局,下拉抽屜中最頂部的一條通知的擴展布局自動展開
Android 7.0(API 24) 開始每條通知均可以單獨展開

操做按鈕

api 19 開始支持添加操做按鈕,每一個展開的通知可包含最多3個操做按鈕

// 添加操做按鈕
builder.addAction(icon1, title1, pendingIntent1);
builder.addAction(icon2, title2, pendingIntent2);複製代碼

樣式

使用Builder.setStyle()設置擴展布局樣式

多行文本通知

Notification notif = new Notification.Builder(mContext)
     .setContentTitle("New mail from " + sender.toString())
     .setContentText(subject)
     .setSmallIcon(R.drawable.new_mail)
     .setLargeIcon(aBitmap)
     .setStyle(new Notification.BigTextStyle().bigText(aVeryLongString))
     .build();複製代碼

大圖通知

Notification notif = new Notification.Builder(mContext)
     .setContentTitle("New photo from " + sender.toString())
     .setContentText(subject)
     .setSmallIcon(R.drawable.new_post)
     .setLargeIcon(aBitmap)
     .setStyle(new Notification.BigPictureStyle().bigPicture(aBigBitmap))
     .build();複製代碼

收件箱通知

最多顯示5行消息

Notification notif = new Notification.Builder(mContext)
     .setContentTitle("5 New mails from " + sender.toString())
     .setContentText(subject)
     .setSmallIcon(R.drawable.new_mail)
     .setLargeIcon(aBitmap)
     .setStyle(new Notification.InboxStyle()
         .addLine(str1)
         .addLine(str2)
         .setContentTitle("")
         .setSummaryText("+3 more"))
     .build();複製代碼

10. 保留 Activity 返回棧

常規 Activity

默認狀況下,從通知啓動一個Activity,按返回鍵會回到主屏幕。

但某些時候有按返回鍵仍然留在當前應用的需求,這就要用到TaskStackBuilder了。

一、在manifest中定義Activity的關係

<activity android:name=".ResultActivity" android:parentActivityName=".MainActivity">
</activity>複製代碼

二、構建帶返回棧的PendingIntent併發送通知

// 構建返回棧
TaskStackBuilder tsb = TaskStackBuilder.create(this);
tsb.addParentStack(ResultActivity.class); 
tsb.addNextIntent(new Intent(this, ResultActivity.class));

// 構建包含返回棧的 PendingIntent
PendingIntent pi = tsb.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

// 構建通知
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
...
builder.setContentIntent(pi);

// 發送通知
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(notifyId, builder.build());複製代碼

特殊Activity

默認狀況下,從通知啓動的Activity會在近期任務列表裏出現。

若是不須要在近期任務裏顯示,則須要作如下操做:

一、在manifest中定義Activity

<activity android:name=".ResultActivity" android:launchMode="singleTask" android:taskAffinity="" android:excludeFromRecents="true">
</activity>複製代碼

二、構建PendingIntent併發送通知

// 建立 Intent
Intent intent = new Intent(this, ResultActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

// 建立 PendingIntent
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

// 構建通知
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
...
builder.setContentIntent(pi);

// 發送通知
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(notifyId, builder.build());複製代碼

Demo

github.com/czy1121/Not…

notify

api 19 (android 4.4)

api19_big_text
api19_big_picture

api 21 (android 5.0)

api21_big_text
api19_big_picture

api21_progress_bar
api21_heads_up

api 24 (android 7.0)

api24_basic
api24_progress_bar

api24_heads_up

參考

developer.android.com/reference/a…
developer.android.com/reference/a…
developer.android.com/guide/topic…

全面瞭解Android Notification
www.jianshu.com/p/22e27a639…

相關文章
相關標籤/搜索