Tworzenie kanałów powiadomień i zarządzanie nimi

Od Androida 8.0 (poziom interfejsu API 26) wszystkie powiadomienia muszą być przypisane do kanału. Dla każdego kanału możesz ustawić zachowanie wizualne i dźwiękowe, które będzie stosowane do wszystkich powiadomień na danym kanale. Użytkownicy mogą zmienić te ustawienia i określić, które kanały powiadomień w aplikacji mogą być uciążliwe, a które widoczne.

Obejrzyj ten film, by poznać kanały i inne funkcje powiadomień w Androidzie 8.0.

Ustawienia użytkownika dotyczące kanałów powiadomień są dostępne w przypadku każdej aplikacji w ustawieniach systemu, jak widać na ilustracji 1.

Rysunek 1. Ustawienia powiadomień z aplikacji Zegar i jednego z jej kanałów.

Po utworzeniu kanału powiadomień nie możesz zmienić sposobu działania powiadomień. Użytkownik ma wtedy pełną kontrolę. Nadal możesz jednak zmienić nazwę i opis kanału.

Utwórz kanał dla każdego typu powiadomień, jakie chcesz wysyłać. Możesz też utworzyć kanały powiadomień, aby odzwierciedlić wybory użytkowników. Możesz na przykład skonfigurować osobne kanały powiadomień dla każdej grupy rozmów utworzonej przez użytkownika w aplikacji do obsługi wiadomości.

Jeśli kierujesz reklamy na Androida 8.0 (poziom interfejsu API 26) lub nowszego, musisz zaimplementować co najmniej 1 kanał powiadomień. Jeśli targetSdkVersion ma wartość 25 lub niższą, to gdy aplikacja działa na Androidzie 8.0 (poziom interfejsu API 26) lub nowszym, będzie działać tak samo jak na urządzeniach z Androidem 7.1 (poziom interfejsu API 25) lub starszym.

Tworzenie kanału powiadomień

Aby utworzyć kanał powiadomień, wykonaj te czynności:

  1. Utwórz obiekt NotificationChannel z unikalnym identyfikatorem kanału, nazwą widoczną dla użytkownika i poziomem ważności.

  2. Opcjonalnie za pomocą właściwości setDescription() możesz określić opis, który użytkownik ma zobaczyć w ustawieniach systemu.

  3. Zarejestruj kanał powiadomień, przekazując go do interfejsu createNotificationChannel().

Z przykładu poniżej dowiesz się, jak utworzyć i zarejestrować kanał powiadomień:

Kotlin

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    // Create the NotificationChannel.
    val name = getString(R.string.channel_name)
    val descriptionText = getString(R.string.channel_description)
    val importance = NotificationManager.IMPORTANCE_DEFAULT
    val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
    mChannel.description = descriptionText
    // Register the channel with the system. You can't change the importance
    // or other notification behaviors after this.
    val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
    notificationManager.createNotificationChannel(mChannel)
}

Java

private void createNotificationChannel() {
    // Create the NotificationChannel, but only on API 26+ because
    // the NotificationChannel class is not in the Support Library.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = getString(R.string.channel_name);
        String description = getString(R.string.channel_description);
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
        channel.setDescription(description);
        // Register the channel with the system. You can't change the importance
        // or other notification behaviors after this.
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }
}

Odtworzenie istniejącego kanału powiadomień z pierwotnymi wartościami nie wykonuje żadnej operacji, więc można bezpiecznie wywołać ten kod przy uruchamianiu aplikacji.

Domyślnie wszystkie powiadomienia publikowane na danym kanale korzystają z zachowań wizualnych i dźwiękowych określonych przez poziom ważności w klasie NotificationManagerCompat, np. IMPORTANCE_DEFAULT lub IMPORTANCE_HIGH. Więcej informacji o poziomach ważności znajdziesz w następnej sekcji.

Jeśli chcesz bardziej dostosować domyślne ustawienia powiadomień na swoim kanale, możesz wywołać metody takie jak enableLights(), setLightColor() i setVibrationPattern() w NotificationChannel. Pamiętaj, że po utworzeniu kanału nie można zmienić tych ustawień, a użytkownik ma ostateczną kontrolę nad tym, czy dane zachowania są aktywne.

Możesz też utworzyć wiele kanałów powiadomień w ramach jednej operacji, wywołując metodę createNotificationChannels().

Ustawianie poziomu ważności

Znaczenie kanału wpływa na poziom przerw we wszystkich powiadomieniach publikowanych na kanale. Określ je w konstruktorze NotificationChannel, używając jednego z 5 poziomów ważności: od IMPORTANCE_NONE(0) do IMPORTANCE_HIGH(4).

Aby obsługiwać urządzenia z Androidem 7.1 (poziom interfejsu API 25) lub niższym, musisz też dla każdego powiadomienia wywoływać metodę setPriority(), używając stałej priorytetu z klasy NotificationCompat.

Stałe ważności (NotificationManager.IMPORTANCE_*) i priorytetu (NotificationCompat.PRIORITY_*) są mapowane na opcje ważności widoczne dla użytkowników, jak pokazano w tej tabeli.

Poziom ważności widoczny dla użytkownika Znaczenie (Android 8.0 i nowsze) Priorytet (Android 7.1 i starsze)
Pilne
Włącza dźwięk i pojawia się jako powiadomienie z ostrzeżeniem.
IMPORTANCE_HIGH PRIORITY_HIGH lub PRIORITY_MAX
Wysoka
Wydaje dźwięk.
IMPORTANCE_DEFAULT PRIORITY_DEFAULT
Średnia
Nie wydaje dźwięku.
IMPORTANCE_LOW PRIORITY_LOW
Niska
Nie wydaje dźwięku i nie pojawia się na pasku stanu.
IMPORTANCE_MIN PRIORITY_MIN
Brak
Nie wydaje dźwięku i nie pojawia się na pasku stanu ani w cieniu.
IMPORTANCE_NONE N/A

Wszystkie powiadomienia, niezależnie od ich ważności, są wyświetlane w miejscach, które nie zakłócają pracy systemu, takich jak panel powiadomień czy plakietka na ikonie programu uruchamiającego, ale możesz zmienić jej wygląd.

Po przesłaniu kanału do NotificationManager nie można już zmienić poziomu ważności. Użytkownik może jednak w każdej chwili zmienić swoje ustawienia kanałów aplikacji.

Informacje o wyborze odpowiedniego poziomu priorytetu znajdziesz w sekcji „Poziomy priorytetów” w przewodniku po projektowaniu powiadomień.

Odczytywanie ustawień kanału powiadomień

Użytkownicy mogą zmieniać ustawienia kanałów powiadomień, w tym zachowania takie jak wibracje i dźwięk alertów. Aby dowiedzieć się, jakie ustawienia użytkownik stosuje w Twoich kanałach powiadomień, wykonaj te czynności:

  1. Pobierz obiekt NotificationChannel, wywołując getNotificationChannel() lub getNotificationChannels().

  2. Wyślij zapytanie dotyczące ustawień kanału, takich jak getVibrationPattern(), getSound() i getImportance().

Jeśli wykryjesz ustawienie kanału, które Twoim zdaniem uniemożliwia prawidłowe działanie aplikacji, możesz zaproponować użytkownikowi zmianę tego ustawienia i wykonać działanie powodujące otwarcie ustawień kanału, jak pokazano w następnej sekcji.

Otwórz ustawienia kanału powiadomień

Po utworzeniu kanału powiadomień nie możesz automatycznie zmieniać wyglądu i dźwięku tego kanału. Tylko użytkownik może zmienić zachowanie kanału w ustawieniach systemu. Aby zapewnić użytkownikom łatwy dostęp do tych ustawień powiadomień, dodaj w interfejsie ustawień aplikacji element, który będzie otwierał te ustawienia systemowe.

Aby otworzyć ustawienia systemowe kanałów powiadomień, kliknij ikonę Intent, która używa działania ACTION_CHANNEL_NOTIFICATION_SETTINGS.

Na przykład ten przykładowy kod pokazuje, jak możesz przekierować użytkownika do ustawień kanału powiadomień:

Kotlin

val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply {
    putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
    putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId())
}
startActivity(intent)

Java

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

Zwróć uwagę, że intencja wymaga 2 dodatkowych elementów określających nazwę pakietu aplikacji (nazywanego też identyfikatorem aplikacji) oraz kanału do edycji.

Usuwanie kanału powiadomień

Możesz usunąć kanały powiadomień, dzwoniąc pod numer deleteNotificationChannel(). Ten przykładowy kod ilustruje, jak wykonać ten proces:

Kotlin

// The id of the channel.
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val id: String = "my_channel_01"
notificationManager.deleteNotificationChannel(id)

Java

NotificationManager notificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// The id of the channel.
String id = "my_channel_01";
notificationManager.deleteNotificationChannel(id);

Tworzenie grupy kanałów powiadomień

Jeśli chcesz bardziej uporządkować wygląd swoich kanałów w ustawieniach interfejsu, możesz utworzyć grupy kanałów. Jest to dobry pomysł, gdy aplikacja obsługuje wiele kont użytkowników, np. profile służbowe, bo pozwala utworzyć grupę kanałów powiadomień dla każdego konta. Dzięki temu użytkownicy mogą łatwo rozpoznawać wiele kanałów powiadomień o identycznych nazwach i nimi zarządzać.

Rysunek 2. Ustawienia kanału powiadomień w grupach na kontach osobistych i służbowych.

Na przykład aplikacja społecznościowa może obsługiwać konta osobiste i służbowe. W takiej sytuacji każde konto może wymagać kilku kanałów powiadomień o identycznych funkcjach i nazwach, takich jak:

  • Konto osobiste z 2 kanałami:

    • Nowe komentarze

    • Rekomendacje postów

  • Konto firmowe z 2 kanałami:

    • Nowe komentarze

    • Rekomendacje postów

Uporządkowanie kanałów powiadomień w grupy dla poszczególnych kont umożliwia użytkownikom rozróżnianie kanałów.

Każda grupa kanałów powiadomień wymaga identyfikatora, który musi być unikalny w obrębie pakietu, a także nazwy widocznej dla użytkownika. Ten fragment kodu pokazuje, jak utworzyć grupę kanałów powiadomień.

Kotlin

// The id of the group.
val groupId = "my_group_01"
// The user-visible name of the group.
val groupName = getString(R.string.group_name)
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))

Java

// The id of the group.
String groupId = "my_group_01";
// The user-visible name of the group.
CharSequence groupName = getString(R.string.group_name);
NotificationManager notificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannelGroup(new NotificationChannelGroup(groupId, groupName));

Po utworzeniu nowej grupy możesz wywołać setGroup(), aby powiązać z nią nowy obiekt NotificationChannel.

Po przesłaniu kanału do menedżera powiadomień nie możesz zmienić powiązania między kanałem powiadomień a grupą.