這幾天做一個小軟件在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);