Szukaj…


Wprowadzenie

Kanały powiadomień pozwalają nam twórcom aplikacji grupować nasze powiadomienia w grupy — kanały — z możliwością modyfikowania ustawień powiadomień dla całego kanału jednocześnie. W Androidzie O ta funkcja została wprowadzona. Obecnie dostępna jest wersja zapoznawcza dla programistów.

Składnia

  1. klasa NotificationUtils {} // Do utworzenia kanału powiadomień
  2. createChannel () // Ogólna metoda tworzenia powiadomień

Parametry

metoda Opis
IMPORTANCE_MAX nie używany
WAŻNOŚĆ: WYSOKA pokazuje wszędzie, robi hałas i zagląda
IMPORTANCE_DEFAULT pokazuje wszędzie, hałasuje, ale nie przeszkadza wizualnie
IMPORTANCE_LOW pokazuje wszędzie, ale nie jest nachalny
IMPORTANCE_MIN pokazuje się tylko w cieniu, poniżej zakładki
IMPORTANCE_NONE powiadomienie bez znaczenia; nie pokazuje się w cieniu

Kanał powiadomień

Jakie są kanały powiadomień?

Kanały powiadomień pozwalają nam twórcom aplikacji grupować nasze powiadomienia w grupy — kanały — z możliwością modyfikowania ustawień powiadomień dla całego kanału jednocześnie. Na przykład dla każdego kanału użytkownicy mogą całkowicie zablokować wszystkie powiadomienia, przesłonić poziom ważności lub zezwolić na wyświetlanie plakietki powiadomień. Ta nowa funkcja pomaga znacznie poprawić wrażenia użytkownika z aplikacji.

Utwórz kanały powiadomień

 import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.content.ContextWrapper;
import android.graphics.Color;
 
public class NotificationUtils extends ContextWrapper {


private NotificationManager mManager;
public static final String ANDROID_CHANNEL_ID = "com.sai.ANDROID";
public static final String IOS_CHANNEL_ID = "com.sai.IOS";
public static final String ANDROID_CHANNEL_NAME = "ANDROID CHANNEL";
public static final String IOS_CHANNEL_NAME = "IOS CHANNEL";

public NotificationUtils(Context base) {
    super(base);
    createChannels();
}

public void createChannels() {

    // create android channel
    NotificationChannel androidChannel = new NotificationChannel(ANDROID_CHANNEL_ID,
            ANDROID_CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
    // Sets whether notifications posted to this channel should display notification lights
    androidChannel.enableLights(true);
    // Sets whether notification posted to this channel should vibrate.
    androidChannel.enableVibration(true);
    // Sets the notification light color for notifications posted to this channel
    androidChannel.setLightColor(Color.BLUE);
    // Sets whether notifications posted to this channel appear on the lockscreen or not
    androidChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);

    getManager().createNotificationChannel(androidChannel);

    // create ios channel
    NotificationChannel iosChannel = new NotificationChannel(IOS_CHANNEL_ID,
            IOS_CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
    iosChannel.enableLights(true);
    iosChannel.enableVibration(true);
    iosChannel.setLightColor(Color.GRAY);
    iosChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
    getManager().createNotificationChannel(iosChannel);


  }


private NotificationManager getManager() {
    if (mManager == null) {
        mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    }
    return mManager;
}}

W powyższym kodzie stworzyliśmy dwie instancje NotificationChannel, przekazując unikalneid nazwę kanału, a także poziom ważności w jego konstruktorze. Dla każdego kanału powiadomień zastosowaliśmy następujące cechy.

  1. Dźwięk
  2. Światła
  3. Wibracja
  4. Powiadomienie do wyświetlenia na ekranie blokady.

Wreszcie otrzymaliśmy NotificationManager z systemu, a następnie zarejestrowaliśmy kanał, wywołując metodę createNotificationChannel (), przekazując utworzony przez nas kanał.

Możemy utworzyć wiele kanałów powiadomień jednocześnie za pomocą createNotificationChannels (), przekazując listę Java instancji NotificationChannel. Możesz uzyskać wszystkie kanały powiadomień dla aplikacji za pomocą getNotificationChannels () i uzyskać określony kanał za pomocą getNotificationChannel (), przekazując tylko identyfikator kanału jako argument.

Poziom ważności w kanałach powiadomień

metoda Opis
IMPORTANCE_MAX nie używany
WAŻNOŚĆ: WYSOKA pokazuje wszędzie, robi hałas i zagląda
IMPORTANCE_DEFAULT pokazuje wszędzie, hałasuje, ale nie przeszkadza wizualnie
IMPORTANCE_LOW pokazuje wszędzie, ale nie jest nachalny, wartość wynosi 0
IMPORTANCE_MIN pokazuje się tylko w cieniu, poniżej zakładki
IMPORTANCE_NONE powiadomienie bez znaczenia; nie pokazuje się w cieniu

Utwórz powiadomienie i opublikuj na kanale

Utworzyliśmy dwa powiadomienia, jedno za pomocą NotificationUtils, drugie za pomocą NotificationBuilder.

public Notification.Builder getAndroidChannelNotification(String title, String body) {
    return new Notification.Builder(getApplicationContext(), ANDROID_CHANNEL_ID)
            .setContentTitle(title)
            .setContentText(body)
            .setSmallIcon(android.R.drawable.stat_notify_more)
            .setAutoCancel(true);
}
 
public Notification.Builder getIosChannelNotification(String title, String body) {
    return new Notification.Builder(getApplicationContext(), IOS_CHANNEL_ID)
            .setContentTitle(title)
            .setContentText(body)
            .setSmallIcon(android.R.drawable.stat_notify_more)
            .setAutoCancel(true);
}

Możemy również ustawić NotificationChannel za pomocą Notification.Builder (). W tym celu możemy użyć setChannel (String channelId) .

Zaktualizuj ustawienia kanału powiadomień

Po utworzeniu kanału powiadomień użytkownik odpowiada za jego ustawienia i zachowanie. Możesz ponownie wywołać metodę createNotificationChannel (), aby zmienić nazwę istniejącego kanału powiadomień lub zaktualizować jego opis. Poniższy przykładowy kod opisuje, w jaki sposób można przekierować użytkownika do ustawień kanału powiadomień, tworząc zamiar rozpoczęcia działania. W takim przypadku zamiar wymaga rozszerzonych danych, w tym identyfikatora kanału powiadomień i nazwy pakietu aplikacji.

@Override
protected void onCreate(Bundle savedInstanceState) {
    //...
    Button buttonAndroidNotifSettings = (Button) findViewById(R.id.btn_android_notif_settings);
    buttonAndroidNotifSettings.setOnClickListener(new View.OnClickListener() {
     
        @Override
        public void onClick(View view) {
            Intent i = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
            i.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
            i.putExtra(Settings.EXTRA_CHANNEL_ID, NotificationUtils.ANDROID_CHANNEL_ID);
            startActivity(i);
        }
    });
}

Plik XML:

<!--...-->
<Button
    android:id="@+id/btn_android_notif_settings"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Notification Settings"/>
<!--...-->

Usuwanie kanału powiadomień

Możesz usunąć kanały powiadomień, wywołując metodę deleteNotificationChannel ().

NotificationManager mNotificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// The id of the channel.
String id = "my_channel_01";
NotificationChannel mChannel = mNotificationManager.getNotificationChannel(id);
mNotificationManager.deleteNotificationChannel(mChannel);

Teraz utwórz MainActivity i xml

Activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_margin="16dp"
        tools:context="com.chikeandroid.tutsplusalerts.MainActivity">
 
    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
 
        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Tuts+ Android Channel"
                android:layout_gravity="center_horizontal"
                android:textAppearance="@style/TextAppearance.AppCompat.Title"/>
 
        <EditText
                android:id="@+id/et_android_title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Title"/>
 
        <EditText
                android:id="@+id/et_android_author"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Author"/>
         
        <Button
                android:id="@+id/btn_send_android"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Send"/>
    </LinearLayout>
 
    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_marginTop="20dp">
 
        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Tuts+ IOS Channel"
                android:layout_gravity="center_horizontal"
                android:textAppearance="@style/TextAppearance.AppCompat.Title"/>
 
        <EditText
                android:id="@+id/et_ios_title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Title"
                />
 
        <EditText
                android:id="@+id/et_ios_author"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Author"/>
        <Button
                android:id="@+id/btn_send_ios"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Send"/>
    </LinearLayout>
     
</LinearLayout>

MainActivity.java

zamierzamy edytować naszą MainActivity, abyśmy mogli uzyskać tytuł i autora ze składników EditText, a następnie wysłać je na kanał Androida. Otrzymujemy Notification.Builder dla kanału Android, który utworzyliśmy w naszych NotificationUtils, a następnie powiadamiamy NotificationManager.

import android.app.Notification; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText;

public class MainActivity extends AppCompatActivity {
 
    private NotificationUtils mNotificationUtils;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mNotificationUtils = new NotificationUtils(this);
 
        final EditText editTextTitleAndroid = (EditText) findViewById(R.id.et_android_title);
        final EditText editTextAuthorAndroid = (EditText) findViewById(R.id.et_android_author);
        Button buttonAndroid = (Button) findViewById(R.id.btn_send_android);
 
        buttonAndroid.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String title = editTextTitleAndroid.getText().toString();
                String author = editTextAuthorAndroid.getText().toString();
 
                if(!TextUtils.isEmpty(title) && !TextUtils.isEmpty(author)) {
                    Notification.Builder nb = mNotificationUtils.
                            getAndroidChannelNotification(title, "By " + author);
 
                    mNotificationUtils.getManager().notify(107, nb.build());
                }
            }
        });
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow