Android Canale di notifica

Esempio

Quali sono i canali di notifica?

I canali di notifica ci consentono agli sviluppatori di app di raggruppare le nostre notifiche in canali di gruppo, con l'utente che ha la possibilità di modificare le impostazioni di notifica per l'intero canale contemporaneamente. Ad esempio, per ciascun canale, gli utenti possono bloccare completamente tutte le notifiche, ignorare il livello di importanza o consentire la visualizzazione di un badge di notifica. Questa nuova funzione aiuta a migliorare notevolmente l'esperienza utente di un'app.

Crea canali di notifica

 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;
}}

Nel codice sopra, abbiamo creato due istanze di NotificationChannel, passando uniqueid un nome di canale, e anche un livello di importanza nel suo costruttore. Per ogni canale di notifica, abbiamo applicato le seguenti caratteristiche.

  1. Suono
  2. Luci
  3. Vibrazione
  4. Notifica da mostrare sulla schermata di blocco.

Infine, abbiamo ottenuto NotificationManager dal sistema e registrato il canale chiamando il metodo createNotificationChannel (), passando il canale che abbiamo creato.

Possiamo creare più canali di notifica contemporaneamente con createNotificationChannels (), passando un elenco Java di istanze di NotificationChannel. Puoi ottenere tutti i canali di notifica per un'app con getNotificationChannels () e ottenere un canale specifico con getNotificationChannel (), passando solo l'id del canale come argomento.

Livello di importanza nei canali di notifica

Metodo Descrizione
IMPORTANCE_MAX non usato
IMPORTANCE_HIGH mostra ovunque, fa rumore e sbircia
IMPORTANCE_DEFAULT mostra ovunque, fa rumore, ma non si intromette visivamente
IMPORTANCE_LOW mostra ovunque, ma non è invadente, il valore è 0
IMPORTANCE_MIN mostra solo all'ombra, sotto la piega
IMPORTANCE_NONE una notifica senza importanza; non mostra nell'ombra

Crea notifiche e invia al canale

Abbiamo creato due notifiche una usando NotificationUtils un'altra usando 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);
}

Possiamo anche impostare NotificationChannel usando Notification.Builder (). Per questo possiamo usare setChannel (String channelId) .

Aggiorna le impostazioni del canale di notifica

Una volta creato un canale di notifica, l'utente è responsabile delle sue impostazioni e del suo comportamento. È possibile chiamare nuovamente createNotificationChannel () per rinominare un canale di notifica esistente o aggiornarne la descrizione. Il seguente codice di esempio descrive come è possibile reindirizzare un utente alle impostazioni per un canale di notifica creando un intent per avviare un'attività. In questo caso, l'intento richiede dati estesi incluso l'ID del canale di notifica e il nome del pacchetto della tua app.

@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);
        }
    });
}

File XML:

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

Eliminazione del canale di notifica

È possibile eliminare i canali di notifica chiamando 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);

Ora crea MainActivity e 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

modificheremo la nostra MainActivity in modo da poter ottenere il titolo e l'autore dai componenti EditText e quindi inviarli al canale Android. Otteniamo Notification.Builder per il canale Android che abbiamo creato nel nostro NotificationUtils e quindi notifichiamo NotificationManager.

importare android.app.Notification; importare android.os.Bundle; import android.support.v7.app.AppCompatActivity; importare android.text.TextUtils; importa android.view.View; importa android.widget.Button; importare 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());
                }
            }
        });
    }
}