Notification 的簡單使用 和 經常使用接口介紹

前言

這是一個基於 Android 10 源碼,全面分析 Android通知系統實現原理 的系列,這是第一篇,全系列將覆蓋:java

寫在前面

本篇關注通知的簡單使用(發送、更新、刪除)和經常使用接口及其意義,同時會解釋兩個容易混淆的接口的區別,setSmallIcon 和 setLargeIcon ,以及發送通知時傳入的tag、id參數的用途。android

附上 Google Notification 官方文檔,包含了各類類型通知的 使用說明 和 使用注意項,本系列是剖析 Android通知系統實現原理,不會在使用上作過多說明。bash

Notification 的簡單使用 和 經常使用接口介紹

來看看如何發送一條通知: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

  • 1.使用 Notification.Builder構建通知
  • 2.根據 Android 版本決定是否設置 Channel
  • 3.構建完成後調用 Notification.Builder.build(); 獲取通知
  • 4.調用 NotificationManager.notify() 發送通知

能夠看到使用是十分簡單的,下面對這幾個步驟展開說明一下:函數

1.Notification 類基於 建造者模式,提供了一個靜態內部類 Builder,以方便咱們設置將要生成的通知的各類屬性,下面解釋下經常使用的方法:post

經常使用Builder方法及其意義解釋.png

這裏強調下 setSmallIcon() 與 setLargeIcon() 的區別:ui

  • 當開發者未設置 largeIcon 時,系統將在通知內容的左側顯示 smallIcon;
  • 當開發者設置了 largeIcon 時,系統會將指定資源覆蓋在 原通知內容左側的 smallIcon 區域;
  • 目前國內各大廠商基本都定製了本身的通知模板,也就是最終 通知內容中的 smallIcon、largeIcon 顯示與否以及顯示位置都受廠商定製影響。

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(),先說明下這幾個參數:

  • **tag:**通知的tag,用以和 id 組合 (tag, id), 以便惟一標識 某應用內的某條通知,對開發者而言,該參數在後續更新和取消通知時會有用
  • **id:**通知的 id,用以和 tag 組合 (tag, id), 以便惟一標識 某應用內的某條通知,對開發者而言,該參數在後續更新和取消通知時會有用
  • **notification:**前面經過 Notification.Builder 構建出來的通知
  • **user:**如今的手機通常都支持多用戶,天然而然的通知應該是跟隨用戶的,因此咱們能夠經過該參數來標識當前用戶

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() 接口讓咱們刪除某應用的所有通知。

相關文章
相關標籤/搜索