這是一個基於 Android 10 源碼,全面分析 Android通知系統實現原理 的系列,這是第一篇,全系列將覆蓋:java
本篇關注通知的簡單使用(發送、更新、刪除)和經常使用接口及其意義,同時會解釋兩個容易混淆的接口的區別,setSmallIcon 和 setLargeIcon
,以及發送通知時傳入的tag、id
參數的用途。android
附上 Google Notification 官方文檔,包含了各類類型通知的 使用說明 和 使用注意項,本系列是剖析 Android通知系統實現原理,不會在使用上作過多說明。bash
來看看如何發送一條通知:app
private void sendNoti(){
final String CHANNEL_ID = "demo_channel_id";
final String CHANNEL_NAME = "demo_channel_name";
final String CHANNEL_DESCRIPTION = "demo_channel_des";
final CharSequence title = "title";
final CharSequence content = "content";
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// 步驟1:告訴 Notification.Builder 咱們須要的通知內容
final Notification.Builder builder = new Notification.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher_round)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setContentTitle(title)
.setContentText(content)
.setWhen(System.currentTimeMillis())
.setContentIntent(contentPendingIntent)
.setDeleteIntent(deletePendingIntent)
.addAction(action);
// 步驟2:Android 8.0 新增了 NotificationChannel,這裏須要作版本區分
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
mChannel.setDescription(CHANNEL_DESCRIPTION);
notificationManager.createNotificationChannel(mChannel);
builder.setChannelId(CHANNEL_ID);
}
// 步驟3:拿到咱們前面讓 Notification.Builder 去幫忙構建的通知
Notification notification = builder.build();
// 步驟4:調用 NotificationManager.notify() 發送通知
notificationManager.notify(notiTag, notiId, notification);
}
複製代碼
總結一下 通知的使用流程 就是:ide
Notification.Builder
構建通知Channel
Notification.Builder.build();
獲取通知NotificationManager.notify()
發送通知能夠看到使用是十分簡單的,下面對這幾個步驟展開說明一下:函數
1.Notification 類基於 建造者模式,提供了一個靜態內部類 Builder,以方便咱們設置將要生成的通知的各類屬性,下面解釋下經常使用的方法:post
這裏強調下 setSmallIcon() 與 setLargeIcon() 的區別:ui
2.下面看看通知的發送、更新、刪除等操做:this
2.1 通知發送:spa
通知發送的入口是:NotificationManager.notify() / notifyAsUser()
函數,其中notify()
有兩個重載方法:
/*frameworks/base/core/java/android/app/NotificationManager.java*/
public void notify(int id, Notification notification)
{
notify(null, id, notification);
}
public void notify(String tag, int id, Notification notification)
{
notifyAsUser(tag, id, notification, mContext.getUser());
}
public void notifyAsUser(String tag, int id, Notification notification, UserHandle user) {......}
複製代碼
最終調用的都是notifyAsUser(String tag, int id, Notification notification, UserHandle user)
這個方法,能夠看到 id 和 notification 是最基本的參數,不可爲空,tag 和 user 可爲空,當咱們不傳入這兩個參數時,系統會默認補充 tag = null 和 user = Context.getUser(),先說明下這幾個參數:
2.2 通知更新:
有些時候咱們發送完通知後,須要對通知的內容進行更新,例如替換圖標資源、文字資源等,這個時候就須要對通知進行更新,通知的更新調用的也是 notify
方法,假定咱們前面已經經過 notify(tag, id, notification)
發送了一條通知,如今咱們但願更新該通知,那麼咱們能夠從新構建一個 Notification 對象,而後再次調用 notify(tag, id, notification)
,傳入同樣的tag、id
,便能實現更新通知的目的了,常見的場景包括 下載中的通知,音樂播放器的通知 等。
2.3 通知刪除:
NotificationManager
提供了多個刪除通知的接口:
/*frameworks/base/core/java/android/app/NotificationManager.java*/
public void cancel(int id)
{
cancel(null, id);
}
public void cancel(String tag, int id)
{
cancelAsUser(tag, id, mContext.getUser());
}
public void cancelAsUser(String tag, int id, UserHandle user) {......}
public void cancelAll() {......}
複製代碼
能夠看到,刪除通知依舊須要用到咱們前面將的 tag、id
,這個很好理解,就很少解釋了,注意 NotificationManager
還提供了一個 cancelAll()
接口讓咱們刪除某應用的所有通知。