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:
Utwórz obiekt
NotificationChannel
z unikalnym identyfikatorem kanału, nazwą widoczną dla użytkownika i poziomem ważności.Opcjonalnie możesz określić opis, który użytkownik widzi w ustawieniach systemu, za pomocą
setDescription()
.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:
Pobierz obiekt
NotificationChannel
, wywołującgetNotificationChannel()
lubgetNotificationChannels()
.Wysyłaj zapytania o ustawienia konkretnych kanałów, takie jak
getVibrationPattern()
,getSound()
igetImportance()
.
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ą.