從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)介都有见秤。
檢查通知渠道的設(shè)置
創(chuàng)建通知渠道的時(shí)候,我們可以指定通知的聲音真椿、振動(dòng)等效果鹃答。同時(shí)用戶也可以在設(shè)置頁(yè)面修改這些設(shè)置,并且用戶設(shè)置的優(yōu)先級(jí)總是更高的突硝。
可以通過(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ā)生了變化