Android 8.0通知欄(Notification)適配


這幾天做一個小軟件在API28(Android 9.0)的模擬器上測試時,發現通知欄無效,經過一番查詢,瞭解到:API26(Android 8.0)以後,引入了**通知渠道(Notification Channels)**這麼一個東西來幫助用戶管理通知。
並且,這個通知渠道(Notification Channels)在API26(Android 8.0)以下的Android設備上運行是會崩潰的,所以這裏我再次踩坑在低版本Android設備上崩潰了…

這裏我們分步解題:

第一步:判斷API

我們需要通過判斷當前設備的API來針對性的進行發送通知欄

if (Build.VERSION.SDK_INT >= 26) {
//這裏是API26以上的方法
} else {
//這裏是API26以下的方法 
}

第二步:NotificationChannel

NotificationChannel三個參數:

ID:通知渠道的 ID ,用戶不可見,實例化Notification的時候需要用到,如果這個 ID 在實例化Notification的時候沒有對應上,通知欄無效,系統還會Toast彈出一個錯誤*(軟件不會閃退)*

Name:這個是便於用戶管理通知用的,用戶可見,如圖:“小詞典溫馨提示” 就是我設置的 Name

在這裏插入圖片描述

Importance:渠道優先級

實例化一個NotificationChannel對象,然後NotificationManager對象調用一下createNotificationChannel()方法並傳入NotificationChannel對象

NotificationChannel channel = new NotificationChannel(ID, NAME, NotificationManager.IMPORTANCE_HIGH);
manager.createNotificationChannel(channel);

第三步:Notification第二個參數

實例化Notification對象,並傳入 id

Notification notification = new Notification.Builder(context, ID)

相對於API26以前的使用只多 2 行代碼,後面的就和API26之前的通知欄一樣了,這裏也同時在告訴我們,知識要不斷更新才穩得住啊,不然就會和我一樣,在無限的閃退和報錯之中迷失了方向~

代碼對比:

NotificationManager manager = (NotificationManager) .getSystemService(NOTIFICATION_SERVICE);
        if (Build.VERSION.SDK_INT >= 26) {//這裏是API26以上的方法
            NotificationChannel channel = new NotificationChannel(ID, NAME, NotificationManager.IMPORTANCE_HIGH);
            manager.createNotificationChannel(channel);
            Notification notification = new Notification.Builder(context, ID)
                    .setContentTitle(title)
                    .setContentText(msg)
                    .setSmallIcon(R.mipmap.img_icon)
                    .build();
            manager.notify(1, notification);
        } else {//這裏是API26以下
            Notification notification = new Notification.Builder(context)
                    .setContentTitle(title)
                    .setContentText(msg)
                    .setSmallIcon(R.mipmap.img_icon)
                    .build();
            manager.notify(1, notification);
        }

拓展

這裏拓展一個API15之前的通知欄(Notification)用法,以前踩的坑,現在基本用不上,也可以瞭解:這裏是把Notification.build()改成了.getNotification(),其他也是沒有變化

Notification notification = new Notification.Builder(context)
                    .setContentTitle(title)
                    .setContentText(msg)
                    .setSmallIcon(R.mipmap.img_icon)
                    .setAutoCancel(true)
                    .setColor(Color.GREEN)
                    .getNotification();//API15以及以下修改這裏即可
            manager.notify(1, notification);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章