Restricciones sobre el inicio de actividades en segundo plano

Android 10 (nivel de API 29) y las versiones posteriores imponen restricciones sobre cuándo pueden iniciarse las apps activity cuando la app se ejecuta en segundo plano. Estas restricciones ayudan a minimizar las interrupciones para el usuario y mantienen al usuario más control sobre lo que se muestra en su pantalla.

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

Cómo mostrar notificaciones

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

Este sistema de alertas y recordatorios basado en notificaciones ofrece varias ventajas. para usuarios:

  • Cuando el usuario utiliza el dispositivo, ve una notificación de atención que le permite responder. El usuario mantiene su contexto actual y tiene control sobre la el contenido que ve en la pantalla.
  • Las notificaciones urgentes respetan las Reglas de No interrumpir. Para Por ejemplo, los usuarios pueden permitir llamadas solo de contactos específicos o de fuentes emisores cuando está habilitado el modo No interrumpir.
  • Cuando la pantalla del dispositivo está apagada, se inicia el intent de pantalla completa de inmediato.
  • En la pantalla Configuración del dispositivo, el usuario puede ver qué apps tienen las notificaciones enviadas recientemente, incluso las de canales de notificaciones específicos. En esa pantalla, el usuario puede controlar sus preferencias de notificaciones.

Cuándo pueden iniciar actividades las apps

Las apps que se ejecutan en Android 10 o versiones posteriores pueden iniciar actividades cuando se cumplen 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 llamada finish() en una actividad muy recientemente. Esto se aplica solo cuando la app tenía un en primer plano o una actividad en la pila de actividades de la tarea en primer plano cuando se llamó a finish().

  • La app tiene uno de los siguientes servicios que está vinculado por el sistema. Estos servicios podrían necesitar iniciar una IU.

  • La app tiene un servicio que está vinculado por otra app visible. La app vinculados al servicio deben permanecer visibles para la aplicación en segundo plano para iniciar las actividades correctamente.

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

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

  • La app recibe una transmisión del sistema en la que se espera que inicie una de la IU de Google. 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 aplicación se asocia con un dispositivo de hardware complementario a través de la CompanionDeviceManager API. Esta API permite que la app inicie actividades en respuesta a acciones que la realiza un usuario en un dispositivo vinculado.

  • La app es un controlador de política de dispositivo que se ejecuta en modo de propietario del dispositivo. Algunos ejemplos de casos de uso son: dispositivos empresariales completamente administrados así como dispositivos exclusivos, como los la señalización digital y los kioscos.

  • El usuario otorga a la app el permiso SYSTEM_ALERT_WINDOW.

Se requiere la aceptación cuando se inician actividades desde PendingIntents

Para evitar que la actividad se inicie accidentalmente según la configuración que se indica condiciones. A partir de Android 14, hay APIs explícitas que te permiten para aceptar o rechazar la concesión de permisos de una app para inicios de actividad.

Las apps orientadas a Android 15 o versiones posteriores dejarán de estar implícitas de forma predeterminada y otorga a PendingIntents privilegios de inicio de actividades en segundo plano (BAL) crear. Se requiere una habilitación explícita. Para hacerlo, estas son las opciones según si la app envía o crea PendingIntents.

Tabla de intents pendientes
Figura 1: Flujo de decisión para inicios de actividades en segundo plano.

Por el remitente del PendingIntent

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

  • Cumplir con las condiciones indicadas y
  • habilitar la opción para permitir el inicio de la actividad en segundo plano según esas excepciones

Esta habilitación solo debería ocurrir si el desarrollador sabe que la app está va a iniciar una actividad.

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

Por el creador del PendingIntent

Las apps orientadas a Android 15 o versiones posteriores que crean un PendingIntent ahora deben Habilitar de forma explícita la opción para permitir el inicio de la actividad en segundo plano si desea que PendingIntents se puedan iniciar en las condiciones indicadas.

En la mayoría de los casos, se debe habilitar la app que inicia la PendingIntent. Sin embargo, si la app que se crea necesita otorgar estos privilegios:

  • Se puede iniciar PendingIntent en cualquier momento en que la app de creación esté visible.
  • El PendingIntent se puede iniciar en cualquier momento si la app de creación tiene una función privilegios.

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

Lee la documentación de referencia relevante para obtener más detalles: