淺談通知頻道NotificationChannel

從Android8.0開(kāi)始,應(yīng)用顯示通知時(shí)刑枝,必須為通知指定一個(gè)ChannelId著拭。我們可以在構(gòu)造通知的時(shí)候看到這個(gè)要求:

public class NotificationCompat {
    public static class Builder {

        public Builder(@NonNull Context context, @NonNull String channelId) {
              // ...
        }

        @Deprecated
        public Builder(Context context) {
            this(context, null);
        }
        
    }
}

之前的構(gòu)造方法已經(jīng)被棄用了唤冈,新的構(gòu)造方法要求用戶添加channelId參數(shù)帅容。

下面我們來(lái)看一下ChannelId以及與其相關(guān)的知識(shí)點(diǎn)颇象。

創(chuàng)建NotificationChannel

一個(gè)channelId對(duì)應(yīng)一個(gè)NotificationChannel,下面代碼展示了如何創(chuàng)建NotificationChannel:

// private static final String NORMAL_CHANNEL_ID = "my_notification_normal";
// private static final String IMPORTANT_CHANNEL_ID = "my_notification_important";

NotificationChannel channel1 = new NotificationChannel(NORMAL_CHANNEL_ID,
        "普通通知", NotificationManager.IMPORTANCE_LOW);
channel1.setDescription("這是普通通知并徘,不太重要");

NotificationChannel channel2 = new NotificationChannel(IMPORTANT_CHANNEL_ID,
        "重要通知", NotificationManager.IMPORTANCE_HIGH);
channel2.setDescription("這是重要通知遣钳,建議開(kāi)啟");

List<NotificationChannel> channels = new ArrayList<>();
channels.add(channel1);
channels.add(channel2);

NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
manager.createNotificationChannels(channels);

這里定義了兩個(gè)NotificationChannel。構(gòu)造方法需要三個(gè)參數(shù)麦乞,ChannelId是自定義的字符串蕴茴;第二個(gè)參數(shù)是頻道的名稱劝评;第三個(gè)是優(yōu)先級(jí)。創(chuàng)建完NotificationChannel之后荐开,還需要使用createNotificationChannels方法注冊(cè)到系統(tǒng)中付翁。

注冊(cè)之后,就可以使用這個(gè)ChannelId去創(chuàng)建通知了晃听。可以針對(duì)一個(gè)渠道設(shè)置通知的聲音砰识、振動(dòng)能扒、優(yōu)先級(jí)等效果。使用該渠道的通知默認(rèn)使用這些提示行為辫狼。

打開(kāi)應(yīng)用設(shè)置初斑,查看通知權(quán)限,會(huì)看到我們新創(chuàng)建的通知渠道膨处,名稱和簡(jiǎn)介都有见秤。

通知渠道在系統(tǒng)通知設(shè)置中的效果

檢查通知渠道的設(shè)置

創(chuàng)建通知渠道的時(shí)候,我們可以指定通知的聲音真椿、振動(dòng)等效果鹃答。同時(shí)用戶也可以在設(shè)置頁(yè)面修改這些設(shè)置,并且用戶設(shè)置的優(yōu)先級(jí)總是更高的突硝。


通知效果設(shè)置

可以通過(guò)getNotificationChannel獲取NotificationChannel测摔,并查看用戶修改后的設(shè)置。

NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channel = manager.getNotificationChannel(IMPORTANT_CHANNEL_ID);
int importance = channel.getImportance();
Uri uri = channel.getSound();

引導(dǎo)用戶修改設(shè)置

如果用戶修改了的設(shè)置解恰,是無(wú)法通過(guò)代碼進(jìn)行修改的锋八。此時(shí)就需要引導(dǎo)用戶跳轉(zhuǎn)到設(shè)置頁(yè)面手動(dòng)進(jìn)行修改:

Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName());
intent.putExtra(Settings.EXTRA_CHANNEL_ID, IMPORTANT_CHANNEL_ID);
context.startActivity(intent);

對(duì)通知渠道進(jìn)行分組

如果應(yīng)用支持多個(gè)用戶,可以把通知按照用戶進(jìn)行分組护盈,不同的用戶可以分別管理自己名下的通知狀態(tài)挟纱。(或者按照任何緯度進(jìn)行分組,請(qǐng)發(fā)揮想象力)

下面的代碼中腐宋,我創(chuàng)建了兩個(gè)通知組每個(gè)組中包含了兩個(gè)通知渠道:


public static void createNotifications(Context context) {
    createAllNotificationChannel(context, "1");
    createAllNotificationChannel(context, "2");
}

public static void createAllNotificationChannel(Context context, String groupId) {
    NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    manager.createNotificationChannelGroup(new NotificationChannelGroup(groupId, "用戶" + groupId));

    NotificationChannel channel1 = new NotificationChannel(NORMAL_CHANNEL_ID + groupId,
            "普通通知", NotificationManager.IMPORTANCE_LOW);
    channel1.setDescription("這是普通通知紊服,不太重要");
    channel1.setGroup(groupId);

    NotificationChannel channel2 = new NotificationChannel(IMPORTANT_CHANNEL_ID + groupId,
            "重要通知", NotificationManager.IMPORTANCE_HIGH);
    channel2.setDescription("這是重要通知,建議開(kāi)啟");
    channel2.setGroup(groupId);

    List<NotificationChannel> channels = new ArrayList<>();
    channels.add(channel1);
    channels.add(channel2);

    manager.createNotificationChannels(channels);
}

注意:雖然通知渠道被分到不同的組中了脏款,但是ChannelId仍然要保持唯一(以為創(chuàng)建通知的時(shí)候只傳入了ChannelId围苫,并沒(méi)有傳遞GroupId)。

回到通知設(shè)置頁(yè)面撤师,我們可以看到頁(yè)面上的效果已經(jīng)發(fā)生了變化

通知渠道分組
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末剂府,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子剃盾,更是在濱河造成了極大的恐慌腺占,老刑警劉巖淤袜,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異衰伯,居然都是意外死亡铡羡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門意鲸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)烦周,“玉大人,你說(shuō)我怎么就攤上這事怎顾《辽鳎” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵槐雾,是天一觀的道長(zhǎng)夭委。 經(jīng)常有香客問(wèn)我,道長(zhǎng)募强,這世上最難降的妖魔是什么株灸? 我笑而不...
    開(kāi)封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮擎值,結(jié)果婚禮上慌烧,老公的妹妹穿的比我還像新娘。我一直安慰自己幅恋,他們只是感情好杏死,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著捆交,像睡著了一般淑翼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上品追,一...
    開(kāi)封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天玄括,我揣著相機(jī)與錄音,去河邊找鬼肉瓦。 笑死遭京,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泞莉。 我是一名探鬼主播哪雕,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鲫趁!你這毒婦竟也來(lái)了斯嚎?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎堡僻,沒(méi)想到半個(gè)月后糠惫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钉疫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年硼讽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牲阁。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡固阁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咨油,到底是詐尸還是另有隱情您炉,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布役电,位于F島的核電站,受9級(jí)特大地震影響棉胀,放射性物質(zhì)發(fā)生泄漏法瑟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一唁奢、第九天 我趴在偏房一處隱蔽的房頂上張望霎挟。 院中可真熱鬧,春花似錦麻掸、人聲如沸酥夭。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)熬北。三九已至,卻和暖如春诚隙,著一層夾襖步出監(jiān)牢的瞬間讶隐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工久又, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巫延,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓地消,卻偏偏與公主長(zhǎng)得像炉峰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脉执,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350