Los procesos en segundo plano pueden consumir mucha memoria y batería. Por ejemplo, un la transmisión implícita puede iniciar muchos procesos en segundo plano registrados en escucharla, incluso si esos procesos no brindan mucho trabajo. Puede tener un un impacto significativo en el rendimiento del dispositivo y la experiencia del usuario.
Para evitar restricciones del sistema, asegúrate de usar la API correcta para tu tarea en segundo plano. El La documentación de Descripción general de las tareas en segundo plano te ayuda a elegir la API adecuada para tus necesidades.
Restricciones iniciadas por el usuario
Si una app muestra comportamientos inadecuados que se describen en Android vitals, haz lo siguiente: el sistema solicita al usuario que restrinja el acceso de esa aplicación a los recursos del sistema.
Si el sistema detecta que una app está consumiendo recursos excesivos, al usuario y le da la opción de restringir las acciones de la aplicación. Entre los comportamientos que pueden activar la notificación, se incluyen los siguientes:
- Bloqueos de activación excesivos: 1 bloqueo de activación parcial retenido durante una hora cuando la pantalla está desactivada
- Exceso de servicios en segundo plano: Si la app está orientada a niveles de API inferiores al 26. y tiene demasiados servicios en segundo plano
Las restricciones precisas que se imponen son determinadas por el fabricante del dispositivo. Para por ejemplo, en compilaciones de AOSP, las apps restringidas no pueden ejecutar tareas, activar alarmas ni usar la red, excepto cuando la app está en primer plano.
Restricciones para la recepción de emisiones de actividad de red
Las apps no reciben transmisiones de CONNECTIVITY_ACTION
si se registran en
recibirán en su manifiesto, y los procesos que dependen de esta transmisión
no se inicia. Esto podría ser un problema para las apps que buscan detectar
o realizar actividades de red masivas cuando el dispositivo se conecta a una
red no medida. Hay varias soluciones para evadir esta restricción.
existen en el framework de Android, pero elegir el correcto depende de lo que
que quieres que tu app logre.
Cómo programar el trabajo en conexiones de uso no medido
Cuando compiles un WorkRequest
, agrega un NetworkType.UNMETERED
Constraint
.
fun scheduleWork(context: Context) {
val workManager = WorkManager.getInstance(context)
val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
.setConstraints(
Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.build()
)
.build()
workManager.enqueue(workRequest)
}
Cuando se cumplan las condiciones para el trabajo, tu app recibirá una devolución de llamada para ejecutarse
El método doWork()
en la clase Worker
especificada
Cómo supervisar la conectividad de red mientras se ejecuta la app
Las apps que están en ejecución pueden detectar CONNECTIVITY_CHANGE
con una
se registró: BroadcastReceiver
. Sin embargo, la API de ConnectivityManager
Proporciona un método más sólido para solicitar una devolución de llamada solo cuando se especifica la red.
se cumplen las condiciones.
Los objetos NetworkRequest
definen los parámetros de la devolución de llamada de red en
condiciones de NetworkCapabilities
. Creas objetos NetworkRequest
con la clase NetworkRequest.Builder
. registerNetworkCallback
Luego, pasa el objeto NetworkRequest
al sistema. Cuando se configura
condiciones de servicio, la app recibe una devolución de llamada para ejecutar la
onAvailable()
definido en su
ConnectivityManager.NetworkCallback
.
La app continúa recibiendo devoluciones de llamada hasta que se cierra o llama unregisterNetworkCallback()
Restricciones para la recepción de emisiones de imagen y video
Las apps no pueden enviar ni recibir ACTION_NEW_PICTURE ni ACTION_NEW_VIDEO. Esta restricción ayuda a aliviar el rendimiento y la experiencia del usuario tiene un impacto en el momento en que varias apps deben activarse en orden para procesar una imagen o un video nuevos.
Cómo determinar qué autoridades de contenido activaron el trabajo
WorkerParameters
permite que tu app reciba información útil sobre lo que
Las autoridades de contenido y los URIs activaron el trabajo:
List<Uri> getTriggeredContentUris()
Muestra una lista de URI que activaron el trabajo. Este campo estará vacío si Ningún URI activó el trabajo (por ejemplo, porque el trabajo se activó debido a una fecha límite u otro motivo), o la cantidad de URI modificados es mayor que
List<String> getTriggeredContentAuthorities()
Muestra una lista de cadenas de autoridades de contenido que activaron el trabajo. Si
la lista que se muestra no está vacía, usa getTriggeredContentUris()
para recuperarla
los detalles de qué URI cambiaron.
En el siguiente código de muestra, se anula el método CoroutineWorker.doWork()
.
y registra las autoridades de contenido y los URI que activaron el trabajo:
class MyWorker(
appContext: Context,
params: WorkerParameters
): CoroutineWorker(appContext, params)
override suspend fun doWork(): Result {
StringBuilder().apply {
append("Media content has changed:\n")
params.triggeredContentAuthorities
.takeIf { it.isNotEmpty() }
?.let { authorities ->
append("Authorities: ${authorities.joinToString(", ")}\n")
append(params.triggeredContentUris.joinToString("\n"))
} ?: append("(No content)")
Log.i(TAG, toString())
}
return Result.success()
}
}
Cómo probar la app bajo restricciones del sistema
Optimizar tus apps para que se ejecuten en dispositivos con poca memoria o en condiciones de poca memoria mejorar el rendimiento y la experiencia del usuario. Eliminación de dependencias en segundo plano y los receptores de transmisiones implícitas registradas en manifiestos pueden ayudar funcionar mejor en esos dispositivos. Te recomendamos que optimices tu app para que se ejecute sin usar por completo estos procesos en segundo plano.
Algunos comandos adicionales de Android Debug Bridge (ADB) pueden ayudarte a probar la app con esos procesos en segundo plano inhabilitados:
Para simular condiciones en las que se hacen transmisiones implícitas y servicios en segundo plano disponible, ingresa el siguiente comando:
$ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND ignore
Para volver a habilitar las transmisiones implícitas y los servicios en segundo plano, ingresa el siguiente código: :
$ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND allow
Cómo optimizar aún más tu app
Para otras buenas formas de optimizar tus tareas en segundo plano el comportamiento de los usuarios, consulta Cómo optimizar el uso de batería para las APIs de programación de tareas en la documentación de Google Cloud.