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

Począwszy od Androida w wersji 8.0 (interfejs API na poziomie 26), wszystkie powiadomienia muszą być przypisane do kanału. W przypadku każdego kanału możesz ustawić zachowanie wizualne i dźwiękowe, które będzie stosowane do wszystkich powiadomień na tym kanale. Użytkownicy mogą zmieniać te ustawienia i decydować, które kanały powiadomień z Twojej aplikacji mogą być natrętne lub widoczne.

Obejrzyj ten film, aby dowiedzieć się więcej o kanałach i innych funkcjach powiadomień w Androidzie 8.0.

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

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

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

Utwórz kanał dla każdego rodzaju powiadomień, które chcesz wysyłać. Możesz też tworzyć kanały powiadomień, które odzwierciedlają 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 przesyłania wiadomości.

Jeśli kierujesz aplikację na Androida 8.0 (API na poziomie 26) lub nowszego, musisz zaimplementować co najmniej 1 kanał powiadomień. Jeśli wartość targetSdkVersion jest ustawiona na 25 lub niższą, aplikacja działa na Androidzie 8.0 (API na poziomie 26) lub nowszym tak samo jak na urządzeniach z Androidem 7.1 (API na poziomie 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 możesz określić opis, który użytkownik widzi w ustawieniach systemu, za pomocą setDescription().

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

SDK_INT

Poniższy przykład pokazuje, 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);
    }
}

Ponowne utworzenie istniejącego kanału powiadomień z jego pierwotnymi wartościami nie powoduje żadnej operacji, więc ten kod można bezpiecznie wywołać podczas uruchamiania aplikacji.

Domyślnie wszystkie powiadomienia publikowane na danym kanale korzystają z zachowań wizualnych i słuchowych zdefiniowanych przez poziom ważności z klasy NotificationManagerCompat, np. IMPORTANCE_DEFAULT lub IMPORTANCE_HIGH. Więcej informacji o poziomach ważności znajdziesz w następnej sekcji.

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

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

Ustawianie poziomu ważności

Ważność kanału wpływa na poziom przerwania wszystkich powiadomień publikowanych na kanale. Określ go w konstruktorze NotificationChannel, używając jednego z 5 poziomów ważności w zakresie od IMPORTANCE_NONE(0) do IMPORTANCE_HIGH(4).

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

Stałe ważności (NotificationManager.IMPORTANCE_*) i priorytetu (NotificationCompat.PRIORITY_*) odpowiadają widocznym dla użytkownika opcjom ważności, jak pokazano w tej tabeli.

Poziom ważności widoczny dla użytkownika Ważność (Android 8.0 lub nowszy) Priorytet (Android 7.1 i starsze)
Pilne
 – odtwarza dźwięk i wyświetla się jako powiadomienie wyskakujące.
IMPORTANCE_HIGH PRIORITY_HIGH lub PRIORITY_MAX
Wysoki
 Wydaje dźwięk.
IMPORTANCE_DEFAULT PRIORITY_DEFAULT
Średnia
 Nie wydaje dźwięku.
IMPORTANCE_LOW PRIORITY_LOW
Niskie
 – nie wydaje dźwięku i nie pojawia się na pasku stanu.
IMPORTANCE_MIN PRIORITY_MIN
Brak
 Nie są sygnalizowane dźwiękiem ani wyświetlane na pasku stanu ani w obszarze powiadomień.
IMPORTANCE_NONE N/A

Wszystkie powiadomienia, niezależnie od ich ważności, pojawiają się w nieprzeszkadzających miejscach interfejsu systemu, np. w panelu powiadomień i jako plakietka na ikonie programu uruchamiającego. Możesz jednak zmienić wygląd plakietki powiadomienia.

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

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

Odczytywanie ustawień kanału powiadomień

Użytkownicy mogą modyfikować ustawienia kanałów powiadomień, w tym zachowania takie jak wibracje i dźwięk alertu. Jeśli chcesz poznać ustawienia, które użytkownik stosuje do Twoich kanałów powiadomień, wykonaj te czynności:

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

  2. Wysyłaj zapytania o ustawienia konkretnych kanałów, takie jak getVibrationPattern(), getSound()getImportance().

Jeśli wykryjesz ustawienie kanału, które Twoim zdaniem utrudnia prawidłowe działanie aplikacji, możesz zaproponować użytkownikowi zmianę tego ustawienia i udostępnić działanie umożliwiają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 programowo zmieniać jego zachowań wizualnych i dźwiękowych. 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 otwiera te ustawienia systemowe.

Ustawienia systemowe kanałów powiadomień możesz otworzyć za pomocą Intent, które używa działania ACTION_CHANNEL_NOTIFICATION_SETTINGS.

Na przykład poniższy przykładowy kod pokazuje, jak 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 informacji, które określają nazwę pakietu aplikacji (znaną też jako identyfikator aplikacji) i kanał do edycji.

Usuwanie kanału powiadomień

Kanały powiadomień możesz usunąć, wywołując funkcję deleteNotificationChannel(). Poniższy przykładowy kod pokazuje, jak przeprowadzić 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 dokładniej uporządkować wygląd kanałów w interfejsie ustawień, możesz utworzyć grupy kanałów. Jest to przydatne, gdy aplikacja obsługuje wiele kont użytkowników, np. w przypadku profili służbowych, ponieważ umożliwia utworzenie grupy kanałów powiadomień dla każdego konta. Dzięki temu użytkownicy mogą łatwo identyfikować i kontrolować wiele kanałów powiadomień o identycznych nazwach.

Rysunek 2. Ustawienia kanałów powiadomień z grupami dla kont osobistych i służbowych.

Na przykład aplikacja do obsługi sieci społecznościowych może obsługiwać konta osobiste i służbowe. W takiej sytuacji każde konto może wymagać wielu kanałów powiadomień o identycznych funkcjach i nazwach, np.:

  • Konto osobiste z 2 kanałami:

    • Nowe komentarze

    • Rekomendacje dotyczące postów

  • Konto firmowe z 2 kanałami:

    • Nowe komentarze

    • Rekomendacje dotyczące postów

Uporządkowanie kanałów powiadomień w grupy dla każdego konta ułatwia użytkownikom odróżnianie ich od siebie.

Każda grupa kanałów powiadomień wymaga identyfikatora, który musi być unikalny w pakiecie, a także nazwy widocznej dla użytkownika. Poniższy 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ć funkcję 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ą.