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

W Androidzie 8.0 (interfejs API na poziomie 26) i nowszych wersjach 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 tym kanale. Użytkownicy mogą zmieniać te ustawienia i decydować, które kanały powiadomień z Twojej aplikacji mogą być uciążliwe lub widoczne.

Obejrzyj poniższy 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 systemowych, jak pokazano na rysunku 1.

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

Po utworzeniu kanału powiadomień nie możesz zmienić zachowań 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 typu powiadomienia, które chcesz wysyłać. Możesz też utworzyć kanały powiadomień, aby odzwierciedlić wybory dokonane przez 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 aplikację na Androida 8.0 (API na poziomie 26) lub nowszego, musisz zaimplementować co najmniej 1 kanał powiadomień. Jeśli parametr targetSdkVersion jest ustawiony na 25 lub mniej, aplikacja uruchomiona na Androidzie 8.0 (interfejs API na poziomie 26) lub nowszym zachowuje się tak samo jak na urządzeniach z Androidem 7.1 (interfejs 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 zobaczy w ustawieniach systemu, za pomocą setDescription().

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

Ten 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 bezpiecznie wywołać ten kod podczas uruchamiania aplikacji.

Domyślnie wszystkie powiadomienia opublikowane w danym kanale korzystają z wizualnych i dźwiękowych zachowań określonych 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 dodatkowo dostosować domyślne zachowania powiadomień kanału, 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 metodę createNotificationChannels().

Ustawianie poziomu ważności

Ważność kanału wpływa na poziom zakłóceń wszystkich powiadomień opublikowanych w kanale. Określ go 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 (interfejs API na poziomie 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_*) są mapowane na opcje ważności widoczne dla użytkownika, jak pokazano w tabeli poniżej.

Poziom ważności widoczny dla użytkownika Ważność (Android 8.0 lub nowszy) Priorytet (Android 7.1 i starsze wersje)
Pilne
Odtwarza dźwięk i wyświetla powiadomienie z ostrzeżeniem.
IMPORTANCE_HIGH PRIORITY_HIGH lub PRIORITY_MAX
Wysoki
Odtwarza dźwięk.
IMPORTANCE_DEFAULT PRIORITY_DEFAULT
Średnia
Nie wydaje dźwięku.
IMPORTANCE_LOW PRIORITY_LOW
Niski
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 obszarze powiadomień.
IMPORTANCE_NONE N/A

Wszystkie powiadomienia, niezależnie od ich ważności, pojawiają się w niezakłócających pracy miejscach interfejsu systemu, takich jak panel powiadomień i plakietka na ikonie programu uruchamiającego, ale możesz 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ć ustawienia kanałów 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 sprawdzić, jakie ustawienia użytkownik stosuje do kanałów powiadomień, wykonaj te czynności:

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

  2. Ustawienia konkretnego kanału zapytania, takie jak getVibrationPattern(), getSound() i getImportance().

Jeśli wykryjesz ustawienie kanału, które Twoim zdaniem uniemożliwia zamierzone działanie aplikacji, możesz zasugerować użytkownikowi jego zmianę i udostępnić działanie, które otworzy ustawienia kanału, jak pokazano w następnej sekcji.

Otwórz ustawienia kanału powiadomień

Po utworzeniu kanału powiadomień nie możesz automatycznie zmienić jego zachowań wizualnych i dźwiękowych. Tylko użytkownik może zmienić zachowanie kanału w ustawieniach systemowych. 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ą obiektu Intent, który używa działania ACTION_CHANNEL_NOTIFICATION_SETTINGS.

Przykładowy kod poniżej 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 elementów, 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 przeprowadzić ten proces:

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

Tworzenie grupy kanałów powiadomień

Jeśli chcesz dodatkowo uporządkować wygląd kanałów w interfejsie ustawień, możesz utworzyć grupy kanałów. To dobry pomysł, 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łu powiadomień z grupami dla kont osobistych i służbowych.

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

  • 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 pozwala użytkownikom je rozróżniać.

Każda grupa kanałów powiadomień wymaga identyfikatora, który musi być unikalny w obrębie pakietu, oraz 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ć 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ą.