Cambios de comportamiento: todas las apps

La plataforma de Android 13 incluye cambios de comportamiento que podrían afectar a tu app. Los siguientes cambios se aplican a todas las apps cuando se ejecutan en Android 13, independientemente de la targetSdkVersion. Debes probar tu app y, luego, modificarla según corresponda para admitir estos cambios.

Asegúrate también de consultar la lista de cambios de comportamiento que solo afectan a las apps orientadas a Android 13.

Rendimiento y batería

Administrador de tareas

En la parte inferior del panel lateral de notificaciones, hay un botón que indica la cantidad de apps que se están ejecutando en segundo plano. Cuando lo presionas, aparece un diálogo en el que se enumeran los nombres de las diferentes apps. El botón Detener se encuentra a la derecha de cada app.
Figura 1: Flujo de trabajo del Administrador de tareas , que permite a los usuarios detener las apps que tienen servicios en primer plano en curso. Este flujo de trabajo solo aparece en dispositivos que ejecutan Android 13 o versiones posteriores.

A partir de Android 13 (nivel de API 33), los usuarios pueden realizar un flujo de trabajo desde el panel lateral de notificaciones para detener las apps que tengan servicios en primer plano en curso, como se muestra en la figura 1. Esta indicación visual se conoce como Administrador de tareas. Las apps deben poder controlar esta detención iniciada por el usuario.

Cómo mejorar el control de los trabajos de carga previa con JobScheduler

JobScheduler proporciona un método para que las apps marquen trabajos específicos como de "carga previa" (con JobInfo.Builder.setPrefetch()), lo que significa que deberían ejecutarse cerca y antes del siguiente inicio de una app para mejorar la experiencia del usuario. En el pasado, JobScheduler solo usaba el indicador para permitir que los trabajos de carga previa usaran datos libres o excedentes de forma oportuna.

En Android 13 (nivel de API 33) y versiones posteriores, el sistema intenta determinar la siguiente vez que se iniciará una app y usa esa estimación para ejecutar trabajos de carga previa. Las apps deben intentar usar los trabajos de carga previa para cualquier tarea que quieran realizar antes del siguiente inicio de una app.

Uso de recursos de batería

Android 13 (nivel de API 33) proporciona las siguientes formas para que el sistema administre mejor la duración de la batería del dispositivo:

  • Se actualizaron las reglas sobre el momento en que el sistema ubica tu app en el bucket de App Standby "restringido".
  • Se agregaron nuevas limitaciones sobre las tareas que tu app puede hacer cuando el usuario la coloca en el estado "restringido" para el uso de batería en segundo plano.

A medida que pruebes tu app con estos cambios, asegúrate de verificar lo siguiente:

  • Prueba cómo responde la app cuando el sistema la ubica en el "restringido" bucket de App Standby. Usa el siguiente comando de Android Debug Bridge (ADB) para asignar tu app a este bucket:

    adb shell am set-standby-bucket PACKAGE_NAME restricted
    
  • Prueba cómo responde tu app a las siguientes restricciones que comúnmente se aplican a las apps que están en un estado"restringido" para el uso de batería en segundo plano:

    • No pueden iniciar servicios en primer plano.
    • Los servicios en primer plano existentes se quitan de este primer plano.
    • No se activan alarmas.
    • No se ejecutan trabajos.

    Usa el siguiente comando de ADB para colocar tu app en este estado "restringido":

    adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND ignore
    

Cuotas de Firebase Cloud Messaging (FCM) de alta prioridad

Android 13 (nivel de API 33) actualiza las cuotas de Firebase Cloud Messaging (FCM) a fin de mejorar la confiabilidad de la entrega de FCM de alta prioridad para apps que muestran notificaciones en respuesta a FCM con este tipo de prioridad. En Android 13 (nivel de API 33), se realizaron los siguientes cambios:

  • Los intervalos de App Standby ya no determinan la cantidad de FCM de alta prioridad que puede usar una app.
  • Las cuotas de FCM de alta prioridad se ajustan en proporción a la cantidad de notificaciones que le se muestran al usuario en respuesta a los FCM de prioridad alta.

Al igual que en las versiones anteriores de Android, los FCM de alta prioridad que superan la cuota cambian a una prioridad normal. Cuando inicias servicios en primer plano (FGS) en respuesta a un FCM, te recomendamos que verifiques el resultado de RemoteMessage.getPriority() para confirmar que sea PRIORITY_HIGH, y también a fin de que controles cualquier posible excepción ForegroundServiceStartNotAllowedException.

Si tu aplicación no siempre publica notificaciones en respuesta a los FCM de alta prioridad, te recomendamos que cambies la prioridad de estos FCM a normal para que los mensajes que dan como resultado una notificación no se cambien a una prioridad inferior.

Privacidad

Permiso de tiempo de ejecución para notificaciones

Android 13 (nivel de API 33) incorpora un nuevo permiso de notificaciones de tiempo de ejecución: POST_NOTIFICATIONS. Este cambio ayuda a los usuarios a centrarse en las notificaciones que les resultan más importantes.

Te recomendamos que orientes tu app a Android 13 o versiones posteriores lo antes posible para obtener los efectos del control y la flexibilidad adicionales de esta función.

Obtén más información sobre las prácticas recomendadas en cuanto a permisos de las apps.

Cómo ocultar contenido sensible del portapapeles

Si tu app permite que los usuarios copien contenido sensible, como contraseñas o información de tarjetas de crédito, en el portapapeles, debes agregar una marca a ClipDescription de ClipData antes de llamar a ClipboardManager#setPrimaryClip(). Agregar esta marca evita que aparezca contenido sensible en la vista previa del contenido.

Vista previa del texto copiado sin marcas en el contenido sensible
Vista previa del texto copiado sin marcas en el contenido sensible.
Vista previa del texto copiado con marcas en el contenido sensible.
Vista previa del texto copiado con marcas en el contenido sensible.

Para marcar contenido sensible, agrega un valor booleano adicional a ClipDescription. Todas las apps deben hacerlo, independientemente del nivel de API objetivo.


// When your app is compiled with the API level 33 SDK or higher
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
    }
}

// If your app is compiled with a lower SDK
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean("android.content.extra.IS_SENSITIVE", true)
    }
}

Para obtener más información sobre la nueva IU del portapapeles, visita la página de la función Copiar y pegar.

Seguridad

Cómo migrar de un ID del usuario compartido

Si tu app usa el atributo obsoleto android:sharedUserId y ya no depende de su funcionalidad, puedes configurar el atributo android:sharedUserMaxSdkVersion en 32, como se muestra en el siguiente fragmento de código:

<manifest ...>
    <!-- To maintain backward compatibility, continue to use
         "android:sharedUserId" if you already added it to your manifest. -->
    android:sharedUserId="SHARED_PACKAGE_NAME"
    android:sharedUserMaxSdkVersion="32"
    ...
</manifest>

Este atributo le indica al sistema que tu app ya no depende de un ID del usuario compartido. Si tu app declara android:sharedUserMaxSdkVersion y se instaló recientemente en dispositivos que ejecutan Android 13 o versiones posteriores, se comportará como si nunca hubieras definido android:sharedUserId. Las apps actualizadas todavía usan el ID actual del usuario compartido.

Los ID del usuario compartidos generan comportamientos no deterministas en el administrador de paquetes. En su lugar, tu app debería usar mecanismos de comunicación adecuados, como servicios y proveedores de contenido, para facilitar la interoperabilidad entre componentes compartidos.

Experiencia del usuario

Notificaciones de servicios en primer plano descartables

En los dispositivos que ejecutan Android 13 o versiones posteriores, de forma predeterminada, los usuarios pueden descartar las notificaciones asociadas con servicios en primer plano.

Funcionalidad principal

Se quitó la copia heredada de la implementación del servicio de voz

Android 13 quita la implementación de SpeechService (incluido el IME de Voice, RecognitionService y unaAPI basada en intents) desde Google app.

En Android 12, se produjeron los siguientes cambios:

  • Las funciones de SpeechService se migraron a la app de Servicios de voz de Google, que se convirtieron en el proveedor predeterminado de SpeechService.
  • Se trasladó la funcionalidad de RecognitionService a la app de Android System Intelligence para admitir el reconocimiento de voz integrado en el dispositivo.

A fin de ayudar a mantener la compatibilidad de las apps en Android 12, Google app usa un trampolín para desviar el tráfico a la app de Servicios de voz de Google. En Android 13, se quitó este trampolín.

Las apps deberían usar el proveedor predeterminado del dispositivo para SpeechService, en lugar de codificar una app específica.