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ó afinish()
.La app tiene uno de los siguientes servicios que está vinculado por el sistema. Estos servicios podrían necesitar iniciar una IU.
AccessibilityService
AutofillService
CallRedirectionService
HostApduService
InCallService
TileService
(no aplicable en Android 14 [nivel de API 34] y versiones posteriores)VoiceInteractionService
VrListenerService
.
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
ySECRET_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
.
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:
ActivityOptions.setPendingIntentBackgroundActivityStartMode
ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode