Cómo iniciar una actividad desde una notificación
Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
Cuando inicias una actividad desde una notificación, debes conservar el
la experiencia de navegación esperada. Cuando el usuario presiona el botón Atrás, debe regresar
el flujo de trabajo normal de la app a la pantalla principal y, luego, abrir la app
La pantalla debe mostrar la actividad como una tarea independiente. Para preservar esta navegación
experiencia, inicia la actividad en una tarea nueva.
El enfoque básico para configurar el comportamiento de toque de tu notificación se describe en
Crea una
notificación.
En esta página, se describe cómo configurar un
PendingIntent
para tu
la acción de la notificación para crear una tarea nueva
la pila. Cómo lo haces
según el tipo de actividad que quieras iniciar:
- Actividad normal
- Corresponde a una actividad que forma parte del flujo normal de la experiencia del usuario de tu app. Cuándo
cuando el usuario llega a la actividad desde la notificación, la nueva tarea debe
incluir una pila de actividades completa que permita al usuario presionar el botón Atrás para navegar
en la jerarquía de las apps.
- Actividad especial
- El usuario solamente ve esta actividad si se inicia desde una notificación. En una
sentido, esta actividad extiende la IU de notificación al proporcionar información que
es difícil de mostrar en la notificación. Esta actividad no necesita un
en la pila de actividades.
Cómo configurar un PendingIntent de actividad normal
Para iniciar una actividad habitual desde tu notificación, configura el PendingIntent
usando TaskStackBuilder
de modo que se cree una nueva pila de actividades de la siguiente manera.
Cómo definir la jerarquía de actividades de tu app
Define la jerarquía natural de tus actividades agregando el elemento
android:parentActivityName
atributo a cada <activity>
en el archivo de manifiesto de tu app. Observa el siguiente ejemplo:
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- MainActivity is the parent for ResultActivity. -->
<activity
android:name=".ResultActivity"
android:parentActivityName=".MainActivity" />
...
</activity>
Cómo compilar un PendingIntent con una pila de actividades
Para iniciar una actividad que incluya una pila de actividades, crea una
instancia de TaskStackBuilder
y llama
addNextIntentWithParentStack()
,
y pásale el Intent
para el
actividad que quieres iniciar.
Siempre y cuando definas la actividad principal para cada actividad como se describe
antes, puedes llamar
getPendingIntent()
para recibir un PendingIntent
que incluya toda la pila de actividades.
Kotlin
// Create an Intent for the activity you want to start.
val resultIntent = Intent(this, ResultActivity::class.java)
// Create the TaskStackBuilder.
val resultPendingIntent: PendingIntent? = TaskStackBuilder.create(this).run {
// Add the intent, which inflates the back stack.
addNextIntentWithParentStack(resultIntent)
// Get the PendingIntent containing the entire back stack.
getPendingIntent(0,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
}
Java
// Create an Intent for the activity you want to start.
Intent resultIntent = new Intent(this, ResultActivity.class);
// Create the TaskStackBuilder and add the intent, which inflates the back
// stack.
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addNextIntentWithParentStack(resultIntent);
// Get the PendingIntent containing the entire back stack.
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(0,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
Si es necesario, puedes agregar argumentos a los objetos Intent
de la pila llamando a
TaskStackBuilder.editIntentAt()
Esto es necesario para garantizar
que una actividad de la pila de actividades
muestra datos significativos cuando el usuario navega hacia ellos.
Luego, puedes pasar el PendingIntent
a la notificación como lo haces normalmente:
Kotlin
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {
setContentIntent(resultPendingIntent)
...
}
with(NotificationManagerCompat.from(this)) {
notify(NOTIFICATION_ID, builder.build())
}
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
builder.setContentIntent(resultPendingIntent);
...
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(NOTIFICATION_ID, builder.build());
Cómo configurar un PendingIntent de actividad especial
Porque una actividad especial que se inicia a partir de una notificación no necesita un retroceso
puedes crear el PendingIntent
llamando
getActivity()
Sin embargo, define las opciones de la tarea apropiadas en el manifiesto.
-
En tu manifiesto, agrega los siguientes atributos al
<activity>
.
-
android:taskAffinity=""
-
En combinación con el
FLAG_ACTIVITY_NEW_TASK
marca que usas en el código, deja este atributo en blanco para garantizar
esta actividad no forma parte de la tarea predeterminada de la app. Cualquiera
no se incluyen las tareas existentes
con la afinidad predeterminada
afectado.
-
android:excludeFromRecents="true"
-
Excluye la nueva tarea de la pantalla Recientes para que el usuario
no puedas volver accidentalmente a ella.
Esto se muestra en el siguiente ejemplo:
<activity
android:name=".ResultActivity"
android:launchMode="singleTask"
android:taskAffinity=""
android:excludeFromRecents="true">
</activity>
-
Compila y emite la notificación:
-
Crea un
Intent
que inicie la
Activity
-
Configura el
Activity
para que comience en una tarea nueva vacía.
llamando
setFlags()
con las marcas FLAG_ACTIVITY_NEW_TASK
y
FLAG_ACTIVITY_CLEAR_TASK
-
Llama para crear un
PendingIntent
getActivity()
Esto se muestra en el siguiente ejemplo:
Kotlin
val notifyIntent = Intent(this, ResultActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
val notifyPendingIntent = PendingIntent.getActivity(
this, 0, notifyIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
Java
Intent notifyIntent = new Intent(this, ResultActivity.class);
// Set the Activity to start in a new, empty task.
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK);
// Create the PendingIntent.
PendingIntent notifyPendingIntent = PendingIntent.getActivity(
this, 0, notifyIntent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
);
- Pasa el
PendingIntent
a la notificación como de costumbre:
Kotlin
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {
setContentIntent(notifyPendingIntent)
...
}
with(NotificationManagerCompat.from(this)) {
notify(NOTIFICATION_ID, builder.build())
}
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
builder.setContentIntent(notifyPendingIntent);
...
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(NOTIFICATION_ID, builder.build());
Para obtener más información sobre las diferentes opciones de tareas y cómo la pila de actividades
, consulta Tareas y la pila de actividades.
El contenido y las muestras de código que aparecen en esta página están sujetas a las licencias que se describen en la Licencia de Contenido. Java y OpenJDK son marcas registradas de Oracle o sus afiliados.
Última actualización: 2025-07-27 (UTC)
[[["Fácil de comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Falta la información que necesito","missingTheInformationINeed","thumb-down"],["Muy complicado o demasiados pasos","tooComplicatedTooManySteps","thumb-down"],["Desactualizado","outOfDate","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Problema con las muestras o los códigos","samplesCodeIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 2025-07-27 (UTC)"],[],[],null,["# Start an Activity from a Notification\n\nWhen you start an activity from a notification, you must preserve the user's\nexpected navigation experience. Tapping the Back button must take the user back\nthrough the app's normal work flow to the Home screen, and opening the Recents\nscreen must show the activity as a separate task. To preserve this navigation\nexperience, start the activity in a fresh task.\n\nThe basic approach to set the tap behavior for your notification is described in\n[Create a basic\nnotification](/develop/ui/views/notifications/build-notification#SimpleNotification).\nThis page describes how to set up a\n[`PendingIntent`](/reference/android/app/PendingIntent) for your\nnotification's action so it creates a fresh [task and back\nstack](/guide/components/activities/tasks-and-back-stack). How you do this\ndepends on which type of activity you're starting:\n\nRegular activity\n: This is an activity that exists as a part of your app's normal UX flow. When\n the user arrives in the activity from the notification, the new task must\n include a complete back stack, letting the user tap the Back button to navigate\n up the app hierarchy.\n\nSpecial activity\n: The user only sees this activity if it's started from a notification. In a\n sense, this activity extends the notification UI by providing information that\n is difficult to display in the notification itself. This activity doesn't need a\n back stack.\n\nSet up a regular activity PendingIntent\n---------------------------------------\n\nTo start a regular activity from your notification, set up the `PendingIntent`\nusing [`TaskStackBuilder`](/reference/androidx/core/app/TaskStackBuilder)\nso that it creates a new back stack as follows.\n\n### Define your app's Activity hierarchy\n\nDefine the natural hierarchy for your activities by adding the\n[`android:parentActivityName`](/guide/topics/manifest/activity-element#parent)\nattribute to each [`\u003cactivity\u003e`](/guide/topics/manifest/activity-element)\nelement in your app manifest file. See the following example: \n\n```xml\n\u003cactivity\n android:name=\".MainActivity\"\n android:label=\"@string/app_name\" \u003e\n \u003cintent-filter\u003e\n \u003caction android:name=\"android.intent.action.MAIN\" /\u003e\n \u003ccategory android:name=\"android.intent.category.LAUNCHER\" /\u003e\n \u003c/intent-filter\u003e\n\u003c/activity\u003e\n\u003c!-- MainActivity is the parent for ResultActivity. --\u003e\n\u003cactivity\n android:name=\".ResultActivity\"\n android:parentActivityName=\".MainActivity\" /\u003e\n ...\n\u003c/activity\u003e\n```\n\n### Build a PendingIntent with a back stack\n\nTo start an activity that includes a back stack of activities, create an\ninstance of `TaskStackBuilder` and call\n[`addNextIntentWithParentStack()`](/reference/androidx/core/app/TaskStackBuilder#addNextIntentWithParentStack(android.content.Intent)),\npassing it the [`Intent`](/reference/android/content/Intent) for the\nactivity you want to start.\n\nAs long as you define the parent activity for each activity as described\nearlier, you can call\n[`getPendingIntent()`](/reference/androidx/core/app/TaskStackBuilder#getPendingIntent(int,int))\nto receive a `PendingIntent` that includes the entire back stack. \n\n### Kotlin\n\n```kotlin\n// Create an Intent for the activity you want to start.\nval resultIntent = Intent(this, ResultActivity::class.java)\n// Create the TaskStackBuilder.\nval resultPendingIntent: PendingIntent? = TaskStackBuilder.create(this).run {\n // Add the intent, which inflates the back stack.\n addNextIntentWithParentStack(resultIntent)\n // Get the PendingIntent containing the entire back stack.\n getPendingIntent(0,\n PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)\n}\n```\n\n### Java\n\n```java\n// Create an Intent for the activity you want to start.\nIntent resultIntent = new Intent(this, ResultActivity.class);\n// Create the TaskStackBuilder and add the intent, which inflates the back\n// stack.\nTaskStackBuilder stackBuilder = TaskStackBuilder.create(this);\nstackBuilder.addNextIntentWithParentStack(resultIntent);\n// Get the PendingIntent containing the entire back stack.\nPendingIntent resultPendingIntent =\n stackBuilder.getPendingIntent(0,\n PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);\n```\n\nIf necessary, you can add arguments to `Intent` objects in the stack by calling\n[`TaskStackBuilder.editIntentAt()`](/reference/androidx/core/app/TaskStackBuilder#editIntentAt(int)).\nThis is sometimes necessary to ensure that an activity in the back stack\ndisplays meaningful data when the user navigates to it.\n\nThen you can pass the `PendingIntent` to the notification as usual: \n\n### Kotlin\n\n```kotlin\nval builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {\n setContentIntent(resultPendingIntent)\n ...\n}\nwith(NotificationManagerCompat.from(this)) {\n notify(NOTIFICATION_ID, builder.build())\n}\n```\n\n### Java\n\n```java\nNotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);\nbuilder.setContentIntent(resultPendingIntent);\n...\nNotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);\nnotificationManager.notify(NOTIFICATION_ID, builder.build());\n```\n\nSet up a special activity PendingIntent\n---------------------------------------\n\nBecause a special activity that starts from a notification doesn't need a back\nstack, you can create the `PendingIntent` by calling\n[`getActivity()`](/reference/android/app/PendingIntent#getActivity(android.content.Context,%20int,%20android.content.Intent,%20int)).\nHowever, define the appropriate task options in the manifest.\n\n1. In your manifest, add the following attributes to the `\u003cactivity\u003e` element.\n\n\n [android:taskAffinity](/guide/topics/manifest/activity-element#aff)`=\"\"`\n :\n Combined with the\n [FLAG_ACTIVITY_NEW_TASK](/reference/android/content/Intent#FLAG_ACTIVITY_NEW_TASK)\n flag that you use in code, set this attribute blank to ensure\n this activity doesn't go into the app's default task. Any\n existing tasks that have the app's default affinity aren't\n affected.\n\n\n [android:excludeFromRecents](/guide/topics/manifest/activity-element#exclude)`=\"true\"`\n :\n Excludes the new task from the Recents screen so that the user\n can't accidentally navigate back to it.\n\n\n This is shown in the following example: \n\n ```xml\n \u003cactivity\n android:name=\".ResultActivity\"\n android:launchMode=\"singleTask\"\n android:taskAffinity=\"\"\n android:excludeFromRecents=\"true\"\u003e\n \u003c/activity\u003e\n ```\n2. Build and issue the notification:\n 1. Create an `Intent` that starts the [Activity](/reference/android/app/Activity).\n 2. Set the `Activity` to start in a new, empty task by calling [setFlags()](/reference/android/content/Intent#setFlags(int)) with the flags `FLAG_ACTIVITY_NEW_TASK` and [FLAG_ACTIVITY_CLEAR_TASK](/reference/android/content/Intent#FLAG_ACTIVITY_CLEAR_TASK).\n 3. Create a `PendingIntent` by calling `getActivity()`.\n\n\n This is shown in the following example: \n\n ### Kotlin\n\n ```kotlin\n val notifyIntent = Intent(this, ResultActivity::class.java).apply {\n flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK\n }\n val notifyPendingIntent = PendingIntent.getActivity(\n this, 0, notifyIntent,\n PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE\n )\n ```\n\n ### Java\n\n ```java\n Intent notifyIntent = new Intent(this, ResultActivity.class);\n // Set the Activity to start in a new, empty task.\n notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK\n | Intent.FLAG_ACTIVITY_CLEAR_TASK);\n // Create the PendingIntent.\n PendingIntent notifyPendingIntent = PendingIntent.getActivity(\n this, 0, notifyIntent,\n PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE\n );\n ```\n3. Pass the `PendingIntent` to the notification as usual: \n\n ### Kotlin\n\n ```kotlin\n val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {\n setContentIntent(notifyPendingIntent)\n ...\n }\n with(NotificationManagerCompat.from(this)) {\n notify(NOTIFICATION_ID, builder.build())\n }\n ```\n\n ### Java\n\n ```java\n NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);\n builder.setContentIntent(notifyPendingIntent);\n ...\n NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);\n notificationManager.notify(NOTIFICATION_ID, builder.build());\n ```\n\nFor more information about the various task options and how the back stack\nworks, see [Tasks and the back stack](/guide/components/activities/tasks-and-back-stack)."]]