Android通知筆記

參考:

一. 概念介紹

  • NotificationId
    ?用來唯一標(biāo)識(shí)一條通知的id,更新通知時(shí)候會(huì)用到
  • NotificationManager
    ?用來管理通知的類,一般用來顯示(notify),取消(cancel)通知,用getSystemService(Context.NOTIFICATION_SERVICE)方法獲取
  • NotificationCompat.Builder
    ?用來創(chuàng)建通知,并進(jìn)行一系列設(shè)置的類
  • PendingIntent
    ?一種用來延遲啟動(dòng)Activity、Service、BroadCast的Intent,通過PendingIntent的getXXX獲取啟動(dòng)Activity、Service等的PI對(duì)象
  • TaskStackBuilder
    ?創(chuàng)建一個(gè)人工的返回棧,用于點(diǎn)擊通知之后啟動(dòng)的Activity按返回返回到其父Activity而不是返回到桌面

二. 通知必備的三要素

創(chuàng)建通知必須要有的三要素,說是三要素,但只有小圖標(biāo)是不可缺少的,缺少之后會(huì)crash,其他兩者缺少的話通知照樣能顯示

  1. 小圖標(biāo)
    ?小圖標(biāo),通過setSmallIcon設(shè)置
  2. 標(biāo)題
    ?通知標(biāo)題,通過setContentTitle設(shè)置
  3. 詳細(xì)文本
    ?通知內(nèi)容,通過setContentText設(shè)置

三. 通知操作

點(diǎn)擊通知后進(jìn)行的操作,常用操作如下:

  1. 打開Activity
    • 利用PendingIntent構(gòu)建想打開的Activity
    • 調(diào)用setContentIntent方法設(shè)置PI
  2. 暫停/繼續(xù)下載
  3. 播放/暫停歌曲
  4. 自定義操作等

四. 通知優(yōu)先級(jí)

通知優(yōu)先級(jí)相當(dāng)于是一個(gè)提示,用來告訴系統(tǒng)用哪種形式顯示UI,有五種模式:-2到2;最高級(jí)別會(huì)以懸浮通知的形式顯示

五. 創(chuàng)建簡(jiǎn)單通知的步驟

  1. 實(shí)例化NotificationCompat.Builder對(duì)象
  2. 創(chuàng)建點(diǎn)擊通知要進(jìn)行的操作(PendingIntent)
  3. 利用Builder對(duì)象對(duì)通知進(jìn)行一系列設(shè)置
  4. 實(shí)例化NotificationManager對(duì)象
  5. 調(diào)用NotificationManager對(duì)象的notify對(duì)象發(fā)送通知
mBuilder = new NotificationCompat.Builder(this);//參數(shù)為Context的構(gòu)造函數(shù)在android8.0以上版本中已棄用,要用Context,channel的構(gòu)造函數(shù)
        Intent resultIntent = new Intent(this, UpdateActivity.class);
        PendingIntent pi = PendingIntent.getActivity(this, REQ_CODE, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
                .setContentTitle("Title")
                .setContentText("Hello,World")
                .setContentIntent(pi)
                .setAutoCancel(true);
        mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        mManager.notify(NOTIFICATION_ID, mBuilder.build());

六. 帶有擴(kuò)展布局的通知

帶有擴(kuò)展布局的通知可以有一個(gè)展開的大視圖,MIUI中可以通過雙指下滑打開,原生系統(tǒng)中可以直接查看大視圖
PS:Android4.1以上才可用,且不同Rom顯示效果都不一樣,以下截圖均為原生效果

  1. 擴(kuò)展布局種類:

    • InboxStyle:包含一系列String的大視圖

      • 方法列表:
        • setBigContentTitle:展開之后的標(biāo)題
        • setSummaryText :對(duì)添加的String數(shù)據(jù)的總結(jié),下圖中的+3more就是
        • addLine:添加一行數(shù)據(jù)
      • 效果:


        InboxStyle
    • BigPictureStyle

      • 方法列表:
        • setBigContentTitle:下圖中的This is big content title
        • setSummaryText:下圖中的This is summary text
        • bigLargeIcon:下圖中的右上角圖標(biāo)
        • bigPicture:下圖中的大圖片
      • 效果:


        BigPictureStyle
    • BigTextStyle

      • 方法列表:
        • bigText:要全部顯示出來的content內(nèi)容,下圖中一長(zhǎng)串文字就是
        • setBigContentTitle:下圖中This is big content title
        • setSummaryText:下圖中This is summary text
      • 效果:通知顯示的時(shí)候,對(duì)contentText默認(rèn)是顯示在一行的,而內(nèi)容要是過多則省略,于是就出來了這個(gè)Style,會(huì)將所有文字都顯示出來


        BigTextStyle
    • MediaStyle

      • 注意:在使用該style之前要添加依賴:implementation 'com.android.support:support-media-compat:version'
      • 方法列表:
      • 效果:用來實(shí)現(xiàn)音樂播放器的Style
    • MessagingStyle

      • 方法列表:
      • 效果:可以在通知欄里面進(jìn)行發(fā)消息等操作
    • DecoratedCustomViewStyle

      • 方法列表:
      • 效果:由系統(tǒng)裝飾的自定義視圖的通知樣式。自定義通知,但不是完全的自定義,相當(dāng)于利用系統(tǒng)的裝飾進(jìn)行自定義
    • DecoratedMediaCustomViewStyle

      • 方法列表:
      • 效果:
  2. 創(chuàng)建擴(kuò)展布局通知的步驟:

    • 和普通通知一樣,實(shí)例化Builder,設(shè)置三要素
    • 新建一個(gè)NotificationCompatStyle(Style就是用來設(shè)置展開布局的),給Style進(jìn)行一系列對(duì)應(yīng)的設(shè)置
    • 調(diào)用Builder.setStyle方法設(shè)置style
    • notify進(jìn)行顯示即可

七. 管理通知

八. 8.0通知渠道適配

前言:8.0對(duì)通知渠道進(jìn)行了較為強(qiáng)硬的要求,不帶有通知渠道的通知是不會(huì)顯示的了。因此要?jiǎng)?chuàng)建通知渠道對(duì)其進(jìn)行適配

  1. 創(chuàng)建通知渠道
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            //創(chuàng)建了兩個(gè)通知渠道,聊天信息和推送信息。兩個(gè)渠道的優(yōu)先級(jí)不同
            createNotificationChannel(CHAT_NOTIFICATION_CHANNEL, "聊天消息", NotificationManager.IMPORTANCE_HIGH);
            createNotificationChannel(SUBSCRIPTION_NOTIFICATION_CHANNEL, "推送信息", NotificationManager.IMPORTANCE_DEFAULT);
        }

/**
     * 創(chuàng)建通知渠道
     * @param id 渠道id,可以為任意字符串。保證全局唯一性即可
     * @param name 通知渠道名稱,會(huì)顯示給用戶,用戶可以對(duì)該渠道進(jìn)行操作
     * @param importance 通知渠道優(yōu)先級(jí)
     */
    @RequiresApi(api = Build.VERSION_CODES.O)
    private void createNotificationChannel(String id, String name, int importance) {
        NotificationChannel channel = new NotificationChannel(id, name, importance);
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        manager.createNotificationChannel(channel);
    }
  1. 創(chuàng)建通知的時(shí)候指定通知渠道
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            Toast.makeText(this, "8.0以上", Toast.LENGTH_SHORT).show();
            Notification notification = new Notification.Builder(this,CHAT_NOTIFICATION_CHANNEL)//就在這里指定渠道
                    .setSmallIcon(R.mipmap.ic_launcher_round)
                    .setContentTitle("聊天消息")
                    .setContentText("今天中午吃啥")
                    .setWhen(System.currentTimeMillis())
                    .build();
            manager.notify(1, notification);
        } else {
            Toast.makeText(this, "8.0以下", Toast.LENGTH_SHORT).show();
            Notification notification = new Notification.Builder(this)
                    .setSmallIcon(R.mipmap.ic_launcher_round)
                    .setContentTitle("聊天消息")
                    .setContentText("今天中午吃啥")
                    .setWhen(System.currentTimeMillis())
                    .build();
            manager.notify(1, notification);
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容