Link: www.jianshu.com/p/d2051a785…
Demo: github.com/czy1121/Not… html
建立通知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();複製代碼
標題/內容/小圖標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");複製代碼
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.setLights
或 builder.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);複製代碼
優先級 | 描述 |
---|---|
Notification.PRIORITY_MAX | 重要而緊急的通知,通知用戶這個事件是時間上緊迫的或者須要當即處理的。 |
Notification.PRIORITY_HIGH | 高優先級用於重要的通訊內容,例如短消息或者聊天,這些都是對用戶來講比較有興趣的 |
Notification.PRIORITY_DEFAULT | 默認優先級用於沒有特殊優先級分類的通知 |
Notification.PRIORITY_LOW | 低優先級能夠通知用戶但又不是很緊急的事件。只顯示狀態欄圖標 |
Notification.PRIORITY_MIN | 用於後臺消息 (例如天氣或者位置信息)。只有用戶下拉通知抽屜才能看到內容 |
設置優先級
builder.setPriority(Notification.PRIORITY_HIGH);複製代碼
提供了 鈴聲/振動/呼吸燈 三種提醒方式,可使用一種或同時使用多種
使用默認提醒
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);複製代碼
點擊內容事件
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);複製代碼
Android 5.0(API 21)開始支持浮動通知
設備處於活動狀態(設備未鎖定且其屏幕已打開)時,可顯示浮動通知
知足下列條件之一可觸發浮動通知:
注:國內各類ROM可能因爲各類緣由致使浮動通知不能顯示
Android 5.0(API 21)開始,通知可顯示在鎖定屏幕上。
可以使用此功能提供媒體播放控件以及其餘經常使用操做。
用戶能夠經過「設置」選擇是否將通知顯示在鎖定屏幕上。
設置可見性
VISIBILITY_PUBLIC
顯示通知的完整內容。VISIBILITY_SECRET
不會在鎖定屏幕上顯示此通知的任何部分。VISIBILITY_PRIVATE
顯示通知圖標和內容標題等基本信息,可是隱藏通知的完整內容。設置 VISIBILITY_PRIVATE
後,還能夠經過 setPublicVersion()
提供其中隱藏了某些詳細信息的替換版本通知內容。
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();複製代碼
默認狀況下,從通知啓動一個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會在近期任務列表裏出現。
若是不須要在近期任務裏顯示,則須要作如下操做:
一、在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());複製代碼
api 19 (android 4.4)
api 21 (android 5.0)
api 24 (android 7.0)
developer.android.com/reference/a…
developer.android.com/reference/a…
developer.android.com/guide/topic…
全面瞭解Android Notification
www.jianshu.com/p/22e27a639…