Restricciones sobre el inicio de actividades en segundo plano

Android 10 (nivel de API 29) y las versiones posteriores imponen restricciones sobre cuándo las apps pueden iniciar actividades cuando se ejecutan en segundo plano. Estas restricciones ayudan a minimizar las interrupciones para el usuario y a que este tenga más control de lo que se muestra en la pantalla.

En esta guía, se presentan notificaciones como alternativa para iniciar actividades en segundo plano. También se enumeran los casos específicos en los que no se aplica la restricción.

Cómo mostrar notificaciones

En casi todos los casos, las apps en segundo plano deben mostrar notificaciones urgentes para proporcionar información urgente al usuario en lugar de iniciar una actividad directamente. Estas notificaciones incluyen el manejo de una llamada telefónica entrante o una alarma de reloj activa.

Este sistema de alertas y recordatorios basado en notificaciones proporciona varias ventajas para los usuarios:

  • Cuando usa el dispositivo, el usuario ve una notificación de atención que le permite responder. El usuario mantiene el contexto actual y controla el contenido que ve en la pantalla.
  • Las notificaciones urgentes respetan las reglas de No interrumpir del usuario. Por ejemplo, los usuarios pueden permitir llamadas solo de contactos específicos o de emisores repetidos cuando la función No interrumpir está habilitada.
  • Cuando la pantalla del dispositivo está apagada, el intent de pantalla completa se inicia inmediatamente.
  • En la pantalla Configuración del dispositivo, el usuario puede ver qué apps enviaron notificaciones recientemente, incluso desde canales de notificaciones específicos. En esa pantalla, el usuario puede controlar sus preferencias de notificaciones.

Cuándo las apps pueden iniciar actividades

Las apps que se ejecutan en Android 10 o versiones posteriores pueden iniciar actividades cuando se cumple una o más de las siguientes condiciones:

  • La app tiene una ventana visible, como una actividad en primer plano.
  • La app tiene una actividad en la pila de actividades de la tarea en primer plano.
  • La app tiene una actividad en la pila de actividades de una tarea existente en la pantalla Recientes.

  • La app tiene una actividad que se inició muy recientemente.

  • La app llamó a finish() en una actividad muy recientemente. Esto se aplica solo cuando la app tenía una actividad en primer plano o una actividad en la pila de actividades de la tarea en primer plano en el momento en que se llamó a finish().

  • La app tiene uno de los siguientes servicios vinculados por el sistema. Es posible que estos servicios necesiten iniciar una IU.

  • La app tiene un servicio vinculado por una app visible diferente. La app vinculada al servicio debe permanecer visible para que la app en segundo plano inicie las actividades correctamente.

  • La app recibe una notificación PendingIntent del sistema. En el caso de intents pendientes para servicios y receptores de emisión, la app puede iniciar actividades durante algunos segundos después del envío del intent pendiente.

  • La app recibe un PendingIntent que se envía desde una app diferente y visible.

  • La app recibe una transmisión del sistema en la que se espera que inicie una IU. Los ejemplos incluyen ACTION_NEW_OUTGOING_CALL y SECRET_CODE_ACTION. La app puede iniciar actividades durante unos segundos luego del envío de la transmisión.

  • La app se asocia con un dispositivo de hardware complementario mediante la API de CompanionDeviceManager. Esta API permite que la app inicie actividades en respuesta a acciones que el usuario realiza en un dispositivo vinculado.

  • La app es un controlador de política de dispositivo que se ejecuta en el modo de propietario del dispositivo. Los casos de uso de ejemplo incluyen dispositivos empresariales completamente administrados y dispositivos dedicados, como la señalización digital y los kioscos.

  • La app recibe el permiso SYSTEM_ALERT_WINDOW del usuario.

Es obligatorio habilitar la opción cuando se inician actividades de PendingIntents

Para evitar permitir inicios accidentales de actividad en función de las condiciones enumeradas, a partir de Android 14, hay APIs explícitas que te permiten habilitar o inhabilitar la concesión de permisos de una app para los inicios de actividad.

De forma predeterminada, las apps orientadas a Android 15 o versiones posteriores ya no otorgarán de manera implícita privilegios de inicio de actividad en segundo plano a los archivos PendingIntents que creen. Se requiere la habilitación explícita. Para hacerlo, estas son las opciones según si la app envía o crea PendingIntents.

Del remitente del PendingIntent

Las apps orientadas a Android 14 o versiones posteriores que quieran iniciar un PendingIntent

  • Cumplir con las condiciones indicadas
  • habilita el inicio de actividades en segundo plano en función de esas excepciones

Esta habilitación solo debe ocurrir si el desarrollador de la app sabe que esta iniciará una actividad.

Para hacerlo, la app debe pasar un paquete ActivityOptions con setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) a PendingIntent.send() o métodos similares.

Del creador de PendingIntent

Las apps orientadas a Android 15 o versiones posteriores que creen un PendingIntent ahora deben habilitar de forma explícita la habilitación de la actividad en segundo plano si desean que se puedan iniciar PendingIntents según las condiciones indicadas.

En la mayoría de los casos, debe habilitarse la app que inicie el PendingIntent. Sin embargo, si la app de creación necesita otorgar estos privilegios:

  • Se puede iniciar PendingIntent en cualquier momento que la app de creación sea visible.
  • PendingIntent se puede iniciar en cualquier momento si la app de creación tiene privilegios especiales.

Para hacerlo, la app debe pasar un paquete ActivityOptions con setPendingIntentCreatorBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) a PendingIntent.getActivity() o métodos similares.

Para obtener más detalles, lee la documentación de referencia relevante: