Buscar..


Introducción

Los canales de notificación nos permiten a los desarrolladores de aplicaciones agrupar nuestras notificaciones en grupos (canales), y el usuario tiene la capacidad de modificar la configuración de notificación para todo el canal a la vez. En Android O se presenta esta función. Ahora mismo está disponible la vista previa para desarrolladores.

Sintaxis

  1. clase NotificationUtils {} // para crear un canal de notificación
  2. createChannel () // Método genérico para crear notificaciones

Parámetros

Método Descripción
IMPORTANCE_MAX no usado
IMPORTANCIA: ALTA Se muestra por todas partes, hace ruido y asoma.
IMPORTANCE_DEFAULT Se muestra en todas partes, hace ruido, pero no interfiere visualmente.
IMPORTANCE_LOW Muestra en todas partes, pero no es intrusivo.
IMPORTANCE_MIN Solo se muestra en la sombra, debajo del pliegue.
IMPORTANCE_NONE una notificación sin importancia; no se muestra en la sombra

Canal de notificaciones

¿Qué son los canales de notificación?

Los canales de notificación nos permiten a los desarrolladores de aplicaciones agrupar nuestras notificaciones en grupos, canales, y el usuario tiene la capacidad de modificar la configuración de notificación para todo el canal a la vez. Por ejemplo, para cada canal, los usuarios pueden bloquear completamente todas las notificaciones, anular el nivel de importancia o permitir que se muestre una credencial de notificación. Esta nueva característica ayuda a mejorar en gran medida la experiencia del usuario de una aplicación.

Crear canales de notificación

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

En el código anterior, creamos dos instancias de NotificationChannel, pasando un nombre de canal a un nombre único y también un nivel de importancia en su constructor. Para cada canal de notificación, aplicamos las siguientes características.

  1. Sonar
  2. Luces
  3. Vibración
  4. Notificación para mostrar en pantalla de bloqueo.

Finalmente, obtuvimos el NotificationManager del sistema y luego registramos el canal llamando al método createNotificationChannel (), pasando el canal que hemos creado.

Podemos crear múltiples canales de notificación a la vez con createNotificationChannels (), pasando una lista de Java de instancias de NotificationChannel. Puede obtener todos los canales de notificación para una aplicación con getNotificationChannels () y obtener un canal específico con getNotificationChannel (), pasando solo la identificación del canal como argumento.

Nivel de importancia en los canales de notificación.

Método Descripción
IMPORTANCE_MAX no usado
IMPORTANCIA: ALTA Se muestra por todas partes, hace ruido y asoma.
IMPORTANCE_DEFAULT Se muestra en todas partes, hace ruido, pero no interfiere visualmente.
IMPORTANCE_LOW Muestra en todas partes, pero no es intrusivo, el valor es 0
IMPORTANCE_MIN Solo se muestra en la sombra, debajo del pliegue.
IMPORTANCE_NONE una notificación sin importancia; no se muestra en la sombra

Crear notificación y publicar en el canal

Hemos creado dos notificaciones una usando NotificationUtils otra 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);
}

También podemos configurar NotificationChannel usando Notification.Builder (). Para eso podemos usar setChannel (String channelId) .

Actualizar la configuración del canal de notificación

Una vez que crea un canal de notificación, el usuario se encarga de su configuración y comportamiento. Puede llamar a createNotificationChannel () nuevamente para cambiar el nombre de un canal de notificación existente o actualizar su descripción. El siguiente código de ejemplo describe cómo puede redirigir a un usuario a la configuración de un canal de notificación al crear una intención de iniciar una actividad. En este caso, la intención requiere datos extendidos, incluido el ID del canal de notificación y el nombre del paquete de su aplicación.

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

Archivo XML:

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

Eliminando el canal de notificación

Puede eliminar los canales de notificación llamando a 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);

Ahora crea MainActivity y 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

Vamos a editar nuestra MainActivity para que podamos obtener el título y el autor de los componentes de EditText y luego enviarlos al canal de Android. Obtenemos Notification.Builder para el canal de Android que creamos en NotificationUtils y luego notificamos a NotificationManager.

importar android.app.Notification; importar android.os.Bundle; importar android.support.v7.app.AppCompatActivity; importar android.text.TextUtils; importar android.view.View; importar android.widget.Button; importar 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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow