¿Cómo enviar notificaciones en Android?

La notificación es un mensaje que aparece fuera de la interfaz de usuario normal de nuestra aplicación. Una notificación puede aparecer en diferentes formatos y ubicaciones, como un ícono en la barra de estado, una entrada más detallada en el cajón de notificaciones, etc. A través de la notificación, podemos notificar a los usuarios sobre cualquier actualización importante, eventos de nuestra aplicación. Al hacer clic en la notificación, el usuario puede abrir cualquier actividad de nuestra aplicación o puede realizar alguna acción, como abrir cualquier página web, etc. 

¿Cómo se ve la notificación ?

Veamos el diseño básico de una plantilla de notificación que aparece en el cajón de navegación. 

How Does Notification Look

Parte de una notificación 

Método para definir contenidos 

El tipo de argumento debe pasar al método.

Icono pequeño establecerPequeñoIcono() necesita pasar un archivo dibujable como una ID que es de tipo Int .
Nombre de la aplicación De forma predeterminada, el nombre de la aplicación lo proporciona el sistema y no podemos anularlo.
Marca de tiempo De forma predeterminada, el sistema proporciona la marca de tiempo, pero podemos anularla con el método setWhen() . Se debe pasar un tipo de datos Long .
Título establecerTituloContenido() Se debe pasar un tipo de datos de string .
Texto establecerTextoContenido() Se debe pasar un tipo de datos de string .
Icono grande establecerLargeIcon() ¡ Un mapa de bits! Se deben pasar los datos del archivo de imagen de tipo. 

Comprender algunos conceptos importantes de Push a Notification

Discutiremos todos los conceptos mencionados a continuación paso a paso,

  1. Creación de una notificación básica
  2. Creando canal de notificaciones
  3. Añadir icono grande
  4. Hacer que la notificación sea expandible
  5. Hacer que se pueda hacer clic en la notificación
  6. Agregar un botón de acción a nuestra notificación

1. Crear una notificación básica 

Para crear una notificación básica, primero necesitamos crear una notificación. Ahora, para crear una notificación, debemos usar la clase NotificationCompat.Builder() donde necesitamos pasar un contexto de actividad y una identificación de canal como argumento al crear una instancia de la clase. Tenga en cuenta que aquí no estamos usando Notification.Builder(). NotificationCompat brinda compatibilidad a las versiones superiores (Android 8.0 y superior) con versiones inferiores (por debajo de Android 8.0).

Kotlin

val nBuilder = NotificationCompat.Builder(this,CHANNEL_ID)
                    .setContentTitle(et1.text.toString())
                    .setContentText(et2.text.toString())
                    .setSmallIcon(R.drawable.spp_notification_foreground)
                    .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                    .build()

Tenga en cuenta que aquí debemos establecer la prioridad de la notificación en consecuencia mediante el método setPriority() .

Ahora, para enviar la notificación, necesitamos un objeto de la clase NotificationManagerCompat y luego lo notificamos.

Kotlin

val nManager = NotificationManagerCompat.from(this)
// Here we need to set an unique id for each
// notification and the notification Builder
            nManager.notify(1, nBuilder)

Tenga en cuenta que, en este método, podemos enviar notificaciones solo en las versiones de Android anteriores a la 8.0, pero en las versiones de Android 8.0 y superiores, no aparecerá ninguna notificación solo con este bloque de código.

2. Creando un canal de notificación

Ahora, para enviar notificaciones en la versión de Android 8.0 y versiones superiores, necesitamos crear un canal de notificación. Este   concepto de canal de notificación proviene de Android 8.0. Aquí, cada aplicación puede tener múltiples canales para diferentes tipos de notificaciones y cada canal tiene algún tipo de notificación. Antes de poder enviar la notificación en Android 8.0 y versiones superiores, debe registrar el canal de notificación de su aplicación en el sistema pasando una instancia de NotificationChannel a createNotificationChannel().

Kotlin

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT).apply {
                description = CHANNEL_DESCRIPTION
            }
            val nManager: NotificationManager =
            getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            nManager.createNotificationChannel(channel)
        }

Tenga en cuenta que aquí debemos proporcionar un CHANNEL_ID único para cada canal y también debemos dar un CHANNEL_NAME y CHANNEL_DESCRIPTION . Además, hay que darle importancia al canal .

3. Agregar un ícono grande

Para configurar un ícono grande, usamos el método setLargeIcon() que se aplica a la instancia de la clase NotificationCompat.Builder(). En este método, necesitamos pasar una forma de mapa de bits de una imagen. Ahora, para convertir un archivo de imagen (por ejemplo, jpg, jpeg, png, etc.) de la carpeta dibujable en un mapa de bits, usamos el siguiente código en Kotlin

Kotlin

// converting a jpeg file to Bitmap file and making an instance of Bitmap!
val imgBitmap=BitmapFactory.decodeResource(resources,R.drawable.gfg_green)
  
// Building notification
val nBuilder= NotificationCompat.Builder(this,CHANNEL_ID)
                    .setContentTitle(et1.text.toString())
                    .setContentText(et2.text.toString())
                    .setSmallIcon(R.drawable.spp_notification_foreground)
                    .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                    // passing the Bitmap object as an argument 
                    .setLargeIcon(imgBitmap)
                    .build()

4. Hacer que la notificación sea expandible

En la plantilla corta de la notificación, no se puede mostrar información grande. Por lo tanto, debemos hacer que la notificación sea expandible de esta manera:

Making notification expandable

para hacer una notificación tan ampliable, usamos el método setStyle() en el objeto generador de notificaciones (nBuilder) . En esta área expandida podemos mostrar una imagen, cualquier texto, diferentes mensajes, etc. En nuestra aplicación, hemos agregado una imagen pasando la instancia de la   clase NotificationCompat.BigPictureStyle al método setStyle().

Kotlin

val imgBitmap = BitmapFactory.decodeResource(resources,R.drawable.gfg_green)
val nBuilder = NotificationCompat.Builder(this,CHANNEL_ID)
                    .setContentTitle(et1.text.toString())
                    .setContentText(et2.text.toString())
                    .setSmallIcon(R.drawable.spp_notification_foreground)
                    .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                    .setLargeIcon(imgBitmap)
                    // Expandable notification
                    .setStyle(NotificationCompat.BigPictureStyle()
                            .bigPicture(imgBitmap)
                            // as we pass null in bigLargeIcon() so the large icon 
                            // will goes away when the notification will be expanded.
                            .bigLargeIcon(null))
                    .build()

5. Hacer clic en la notificación

Necesitamos hacer que se pueda hacer clic en nuestra notificación para realizar alguna acción haciendo clic en la notificación, como abrir una actividad o configuración del sistema o cualquier página web, etc. Ahora, para realizar tales acciones, se necesita intención (por ejemplo, intención explícita o implícita). En nuestra Aplicación, tenemos la intención implícita de abrir la página de inicio oficial de GFG.

Kotlin

// Creating the Implicit Intent to 
// open the home page of GFG   
val intent1= Intent()
        intent1.action=Intent.ACTION_VIEW
        intent1.data=Uri.parse("https://www.geeksforgeeks.org/")

Ahora no es necesario que cada vez que aparezca la notificación, el usuario haga clic en ella instantáneamente, el usuario puede hacer clic en ella cuando quiera y, por lo tanto, también necesitamos crear una instancia de PendingIntent que básicamente hace que la acción de intención quede pendiente para propósitos futuros.

Kotlin

val pendingIntent1=PendingIntent.getActivity(this, 5, intent1, PendingIntent.FLAG_UPDATE_CURRENT)
  
// Here the four parameters are context of activity,
// requestCode,Intent and flag of the pendingIntent respectively
// The request code is used to trigger a
// particular action in application activity
val nBuilder = NotificationCompat.Builder(this,CHANNEL_ID)
                    .setContentTitle(et1.text.toString())
                    .setContentText(et2.text.toString())
                    .setSmallIcon(R.drawable.notifications)
                    .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                    .setLargeIcon(imgBitmap)
                    .setStyle(NotificationCompat.BigPictureStyle()
                            .bigPicture(imgBitmap)
                            .bigLargeIcon(null))
                    // here we are passing the pending intent 
                    .setContentIntent(pendingIntent1)
                    // as we set auto cancel true, the notification 
                    // will disappear after afret clicking it
                    .setAutoCancel(true)
                    .build()

6. Agregar un botón de acción a nuestra notificación

A veces existe algún botón de acción en nuestra plantilla de notificación que se usa para realizar alguna acción.

Adding an action button to our notification

Aquí también necesitamos un Intent y un PendingIntent . Luego, debemos pasar la instancia de PendingIntent al método addAction() en el momento de crear la notificación.

Kotlin

// Creating the Implicit Intent 
// to open the GFG contribution page   
val intent2 = Intent()
        intent2.action = Intent.ACTION_VIEW
        intent2.data = Uri.parse("https://www.geeksforgeeks.org/contribute/")
  
val nBuilder = NotificationCompat.Builder(this,CHANNEL_ID)
                    .setContentTitle(et1.text.toString())
                    .setContentText(et2.text.toString())
                    .setSmallIcon(R.drawable.notifications)
                    .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                    .setLargeIcon(imgBitmap)
                    .setStyle(NotificationCompat.BigPictureStyle()
                            .bigPicture(imgBitmap)
                            .bigLargeIcon(null))
                    .setContentIntent(pendingIntent1)
                    .setAutoCancel(true)
                    // Here we need to pass 3 arguments which are 
                    // icon id, title, pendingIntent respectively
                    // Here we pass 0 as icon id which means no icon
                    .addAction(0,"LET CONTRIBUTE",pendingIntent2)
                    .build()

Ejemplo

Analicemos todos los conceptos creando una aplicación llamada GFG_PushNotification. qué

Push Notification in Android

Implementación paso a paso

Paso 1: Crear un nuevo proyecto

Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione Kotlin como lenguaje de programación. Elija el nivel de API según su elección (aquí hemos elegido el nivel de API 26).

Después de crear el proyecto con éxito, pegue algunas imágenes en la carpeta dibujable en el directorio res. Ahora puede usar las mismas imágenes que he usado en mi proyecto; de lo contrario, puede elegir las imágenes que desee. Para descargar las mismas imágenes, haga clic en el siguiente enlace:

HAGA CLIC AQUÍ

***Tenga en cuenta que es opcional***

Paso 2: trabajar con el archivo activity_main.xml

Vaya al archivo activity_main.xml y consulte el siguiente código. A continuación se muestra el código para el archivo activity_main.xml .

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
  
    <ImageView
        android:id="@+id/imgGFG"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="70dp"
        android:src="@drawable/gfg_white" />
  
    <!-- EditText for entering the title-->
    <EditText
        android:id="@+id/et1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/imgGFG"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="30dp"
        android:background="#d7ffd9"
        android:hint="Enter The Title"
        android:padding="10dp"
        android:textSize="20sp"
        android:textStyle="bold" />
  
    <!-- EditText for entering the text-->
    <EditText
        android:id="@+id/et2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/et1"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="30dp"
        android:layout_marginRight="30dp"
        android:background="#d7ffd9"
        android:hint="Enter The Text"
        android:padding="10dp"
        android:textSize="20sp"
        android:textStyle="bold" />
  
    <!-- Button for sending notification-->
    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/et2"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="30dp"
        android:layout_marginRight="30dp"
        android:background="#0F9D58"
        android:text="send notification"
        android:textColor="#000000"
        android:textSize="20sp"
        android:textStyle="bold" />
  
</RelativeLayout>

APPLICATION UI DESIGN

Paso 3: inserte un activo vectorial en la carpeta dibujable en el directorio res

Haga clic con el botón derecho en la carpeta dibujable → NuevoVector activo → seleccione la imagen prediseñada adecuada → asigne el nombre apropiado y ajuste el tamaño en consecuencia → A continuación, haga clic en el botón Finalizar como se muestra en la imagen a continuación.

Paso 4: trabajar con el archivo MainActivity.kt

Vaya al archivo MainActivity.kt y consulte el siguiente código. A continuación se muestra el código del archivo MainActivity.kt . Se agregan comentarios dentro del código para comprender el código con más detalle.

Kotlin

import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
  
class MainActivity : AppCompatActivity() {
    val CHANNEL_ID = "GFG"
    val CHANNEL_NAME = "GFG ContentWriting"
    val CHANNEL_DESCRIPTION = "GFG NOTIFICATION"
  
    // the String form of link for 
    // opening the GFG home-page
    val link1 = "https://www.geeksforgeeks.org/"
  
    // the String form of link for opening
    // the GFG contribution-page
    val link2 = "https://www.geeksforgeeks.org/contribute/"
    lateinit var et1: EditText
    lateinit var et2: EditText
    lateinit var btn1: Button
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
         
        // Binding Views by their IDs
        et1 = findViewById(R.id.et1)
        et2 = findViewById(R.id.et2)
        btn1 = findViewById(R.id.btn1)
        btn1.setOnClickListener {
              
            // Converting the .png Image file to a Bitmap!
            val imgBitmap = BitmapFactory.decodeResource(resources, R.drawable.gfg_green)
              
            // Making intent1 to open the GFG home page
            val intent1 = gfgOpenerIntent(link1)
              
            // Making intent2 to open The GFG contribution page
            val intent2 = gfgOpenerIntent(link2)
              
            // Making pendingIntent1 to open the GFG home 
            // page after clicking the Notification
            val pendingIntent1 = PendingIntent.getActivity(this, 5, intent1, PendingIntent.FLAG_UPDATE_CURRENT)
              
            // Making pendingIntent2 to open the GFG contribution 
            // page after clicking the actionButton of the notification
            val pendingIntent2 = PendingIntent.getActivity(this, 6, intent2, PendingIntent.FLAG_UPDATE_CURRENT)
              
            // By invoking the notificationChannel() function we 
            // are registering our channel to the System
            notificationChannel()
              
            // Building the notification
            val nBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
                      
                    // adding notification Title
                    .setContentTitle(et1.text.toString())
                      
                    // adding notification Text
                    .setContentText(et2.text.toString())
                      
                    // adding notification SmallIcon
                    .setSmallIcon(R.drawable.ic_android_black_24dp)
                      
                    // adding notification Priority
                    .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                      
                    // making the notification clickable
                    .setContentIntent(pendingIntent1)
                    .setAutoCancel(true)
                      
                    // adding action button
                    .addAction(0, "LET CONTRIBUTE", pendingIntent2)
                      
                    // adding largeIcon
                    .setLargeIcon(imgBitmap)
                      
                    // making notification Expandable
                    .setStyle(NotificationCompat.BigPictureStyle()
                            .bigPicture(imgBitmap)
                            .bigLargeIcon(null))
                    .build()
            // finally notifying the notification
            val nManager = NotificationManagerCompat.from(this)
            nManager.notify(1, nBuilder)
        }
    }
  
    // Creating the notification channel
    private fun notificationChannel() {
        // check if the version is equal or greater
        // than android oreo version
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // creating notification channel and setting 
            // the description of the channel
            val channel = NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT).apply {
                description = CHANNEL_DESCRIPTION
            }
            // registering the channel to the System
            val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            notificationManager.createNotificationChannel(channel)
        }
    }
  
    // The function gfgOpenerIntent() returns 
    // an Implicit Intent to open a webpage
    private fun gfgOpenerIntent(link: String): Intent {
        val intent = Intent()
        intent.action = Intent.ACTION_VIEW
        intent.data = Uri.parse(link)
        return intent
    }
}

Salida :

Publicación traducida automáticamente

Artículo escrito por the_dir_one y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *