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

Począwszy od Androida 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ń. Użytkownik ma wtedy pełną kontrolę. Możesz jednak zmienić nazwę i opis kanału.

Utwórz kanał powiadomień dla każdego typu powiadomień, które chcesz wysyłać. Możesz też tworzyć kanały powiadomień odzwierciedlające wybory użytkowników. Możesz na przykład skonfigurować oddzielne kanały powiadomień dla każdej grupy rozmów utworzonej przez użytkownika w komunikatorze.

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łająca na Androidzie 8.0 (API na poziomie 26) lub nowszym zachowuje się 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().

Poniższy przykład pokazuje, jak utworzyć i zarejestrować kanał powiadomień:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    // Create the NotificationChannel.
    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 =
        context.getSystemService(NotificationManager::class.java)
    notificationManager?.createNotificationChannel(mChannel)
}

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

Domyślnie wszystkie powiadomienia publikowane w 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 createNotificationChannels().

Ustawianie poziomu ważności

Ważność kanału wpływa na poziom przerywania wszystkich powiadomień publikowanych na tym 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 (interfejs API na poziomie 25) lub starszym, musisz też wywoływać 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 z ostrzeżeniem.
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 lub 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żna zmienić poziomu ważności. Użytkownik może jednak w każdej chwili zmienić ustawienia dotyczące kanałów Twojej aplikacji.

Więcej informacji 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 funkcję 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 zamierzone 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.

Otwieranie ustawień 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 zmieniać zachowania kanałów w ustawieniach systemu. Aby zapewnić użytkownikom szybki 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ń:

val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply {
    putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName)
    putExtra(Settings.EXTRA_CHANNEL_ID, CHANNEL_ID)
}
Button(onClick = {
    context.startActivity(intent)
}) {
    Text("Open Channel Settings")
}

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 deleteNotificationChannel(). Poniższy przykładowy kod pokazuje, jak to zrobić:

val notificationManager =
    ContextCompat.getSystemService<NotificationManager>(context, NotificationManager::class.java)
notificationManager?.deleteNotificationChannel(channelId)

Tworzenie grupy kanałów powiadomień

Jeśli chcesz lepiej uporządkować wygląd kanałów w interfejsie ustawień, możesz utworzyć grupy kanałów. Jest to przydatne, gdy aplikacja obsługuje wielu użytkowników, ponieważ umożliwia utworzenie grupy kanałów powiadomień dla każdego konta. Grupy kanałów pomagają użytkownikom odróżniać 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 ramach pakietu, a także nazwy widocznej dla użytkownika. Poniższy fragment kodu pokazuje, jak utworzyć grupę kanałów powiadomień.

fun createNotificationChannelGroup(context: Context, groupId: String, groupName: String) {
    val notificationManager =
        ContextCompat.getSystemService(context, NotificationManager::class.java)
    notificationManager?.createNotificationChannelGroup(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ą.