android8 通知呼吸灯_Android8.0及以上的Notification
這篇文章上次修改于 702 天前,可能其部分內容已經發生變化,如有疑問可詢問作者。
在新版本上(Android8.0及以上)開發時,會遇到一些問題,比如,不顯示通知,Notification 聲音不可控,刪除 channel 刪到崩潰。
閑下來測試一番,總結 Notification 如下:
首先,Android8.0 及以上版本使用 Notification 需要為其設置 NotificationChannel ,理解為頻道,為 Notification 歸類,統一管理,設置聲音,震動等都需要通過 NotificationChannel 進行設置NotificationChannel channel = new ...
channel.setSound(null,null);//靜音
channel.enableVibration(true);//震動
channel.setVibrationPattern(new long[]{100,200,300});//震動模式
channel.enableLights(true);//呼吸燈
channel.setLightColor(Color.rgb(0,0,0));//呼吸燈顏色
NotificationChannel 構造函數參數解釋id :唯一標示
name :顯示在應用詳情中的名稱,不唯一,可重復,即使在同一組中也可重復(下面會提到組的概念)。
importance :級別,重要性 NotificationManager 共提供了7個級別的常量NotificationManager.IMPORTANCE_UNSPECIFIED
NotificationManager.IMPORTANCE_NONE
NotificationManager.IMPORTANCE_MIN
NotificationManager.IMPORTANCE_LOW
NotificationManager.IMPORTANCE_DEFAULT
NotificationManager.IMPORTANCE_HIGH
NotificationManager.IMPORTANCE_MAX
NotificationChannel 構造函數里 id 是唯一的,使用相同 id ,不同 name new出的新對象代表的是同一個 channel ,name 會被最后一個 NotificationManager.createNotificationChannel(channel) 中的 channel name 覆蓋。
還有一個為 NotificationChannel 歸類的組的概念,NotificationChannelGroup , 他的構造函數只有 id 和 name ,同樣的,和上面 NotificationChannel 的含義一樣,略。
將 NotificationChannel 添加到 NotificationChannelGroup 的方式,不是 group.add 或 group.set ,而是NotificationChannel channel = new ...
channel.setGroup("group1");//傳參 NotificationChannelGroup的id
由于是上面這種方式關聯二者,所以 NotificationChannelGroup 必須先創建NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannelGroup group = new NotificationChannelGroup("group1","This is Group 1");
manager.createNotificationChannelGroup(group);
再通過 channel.setGroup("group1") 做關聯,否則會報異常Caused by: java.lang.IllegalArgumentException: NotificationChannelGroup doesn't exist
并且 channel.setGroup("group1") 必須在 NotificationManager.createNotificationChannel(channel) 之前設置,否則無效,所以,他們的順序是manager.createNotificationChannelGroup(group);
channel.setGroup("group1");
manager.createNotificationChannel(channel);
當 NotificationChannelGroup 在沒有添加任何 NotificationChannel 時,在應用詳情中不會顯示該組
NotificationChannelGroup 好像記仇,channel 只要加進去的,就永遠刪不掉,嘗試使用channel.setGroup(null);//置空
channel.setGroup("group2");//設置到其他組
都不管用,通過manager.deleteNotificationChannel("channel1");//傳參 channel的id
也只是能隱藏 channel,如果還用相同的 id 創建 channel ,新 channel 還在第一次加入的那個組中,只有卸載應用才能刪除 channel ,在開發時,一定要注意這一點,在調試時,可以采用不同的 id 以避免出現詭異的現象。
我理解這是一個注冊的機制,應用安裝后,只要 NotificationManager.createNotificationXXX 代碼運行一次就注冊了,即使應用以后的版本注釋了該段代碼,他依然有效,想要"刪除",需要主動調用 NotificationManager.deleteNotificationXXX ,想要徹底刪除只能卸載應用~
還要提一點, NotificationCompat.Builder 的構造函數中 channelId 必須是注冊過的 channelId,否則在 NotificationManager.notify 時,不會出現通知,也不會報像 channel doesn't exist 的異常。
2019/1/18.
Dean.King
Beijing
總結
以上是生活随笔為你收集整理的android8 通知呼吸灯_Android8.0及以上的Notification的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (BFS)Prime Path (poj
- 下一篇: (并查集)Wireless Networ