En este tutorial, aprenderá cómo crear una notificación de progreso básica (indicador de progreso indeterminado e indicador de progreso de duración fija) para Android usando Kotlin.
Antes de comenzar, primero comprendamos los componentes de una notificación en Android.
- Icono pequeño : obligatorio , se puede configurar con setSmallIcon().
- Nombre de la aplicación : proporcionado por el sistema.
- Marca de tiempo : proporcionada por el sistema, pero se puede anular.
- Icono grande : opcional , se puede configurar con setLargeIcon().
- Título : opcional , se puede establecer con setContentTitle().
- Texto : opcional , se puede configurar con setContentText().
Nota: Canales de notificación
Desde la introducción de la versión 8 de Android (Android Oreo), ahora es obligatorio categorizar todas las notificaciones en categorías denominadas «canales», esto es para comodidad de los usuarios y también de los desarrolladores.
La imagen a continuación nos muestra un canal de notificación llamado ‘Notificación de progreso’.
Since we only need to create a channel once, we’ll use a helper class ‘App.kt’ to get the job done.
aplicación.kt
package com.gfg.progressnotificationdemo import android.app.Application import android.app.NotificationChannel import android.app.NotificationManager import android.os.Build class App : Application(){ val channelId = "Progress Notification" as String override fun onCreate(){ super.onCreate() createNotificationChannels() } //Check if the Android version is greater than 8. (Android Oreo) private fun createNotificationChannels(){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel1 = NotificationChannel( channelId, "Progress Notification", //IMPORTANCE_HIGH = shows a notification as peek notification. //IMPORTANCE_LOW = shows the notification in the status bar. NotificationManager.IMPORTANCE_HIGH ) channel1.description = "Progress Notification Channel" val manager = getSystemService( NotificationManager::class.java ) manager.createNotificationChannel(channel1) } } }
Now, in the main activity we’ll use a thread to invoke the notification.
MainActivity.kt
package com.gfg.progressnotificationdemo import android.app.PendingIntent import android.content.Intent import android.os.Bundle import android.os.SystemClock import android.view.View import androidx.appcompat.app.AppCompatActivity import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import com.gfg.progressnotificationdemo.R.drawable class MainActivity : AppCompatActivity(){ private lateinit var notificationManager: NotificationManagerCompat val channelId = "Progress Notification" as String override fun onCreate(savedInstanceState: Bundle?){ super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //Create a Notification Manager notificationManager = NotificationManagerCompat.from(this) } //Start() is called when the buttons is pressed. public fun start(view: View){ val intent = Intent(this, MainActivity::class.java).apply{ flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val pendingIntent: PendingIntent = PendingIntent.getActivity( this, 0, intent, 0) //Sets the maximum progress as 100 val progressMax = 100 //Creating a notification and setting its various attributes val notification = NotificationCompat.Builder(this, channelId) .setSmallIcon(drawable.ic_file_download) .setContentTitle("GeeksforGeeks") .setContentText("Downloading") .setPriority(NotificationCompat.PRIORITY_LOW) .setOngoing(true) .setOnlyAlertOnce(true) .setProgress(progressMax, 0, true) .setContentIntent(pendingIntent) .setAutoCancel(true) //Initial Alert notificationManager.notify(1, notification.build()) Thread(Runnable{ SystemClock.sleep(2000) var progress = 0 while (progress <= progressMax) { SystemClock.sleep( 1000 ) progress += 20 //Use this to make it a Fixed-duration progress indicator notification //notification.setContentText(progress.toString()+"%") //.setProgress(progressMax, progress, false) //notificationManager.notify(1, notification.build()) } notification.setContentText("Download complete") .setProgress(0, 0, false) .setOngoing(false) notificationManager.notify(1, notification.build()) }).start() } }
Actividad Principal.xml
El diseño consta de un solo botón.
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical"> <Button android:layout_width="wrap_content" android:layout_height="75dp" android:onClick="start" android:text="Show Notification" android:textSize="22sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
Producción:
- Indicador de progreso de duración fija: (después de agregar código en los comentarios en la línea 67 de MainActivity.kt)
- Indicador de progreso indeterminado:
- Después de la descarga:
Así de fácil y sencillo es agregar un indicador de progreso a una notificación en Android usando Kotlin.