El uso de un bloqueo de activación puede perjudicar el rendimiento del dispositivo. Si necesitas usar un bloqueo de activación, es importante que lo hagas correctamente. En este documento, se incluyen algunas prácticas recomendadas que pueden ayudarte a evitar las dificultades comunes del bloqueo de activación.
Asigna un nombre correcto al bloqueo de activación
Te recomendamos que incluyas el nombre de tu paquete, clase o método en la etiqueta de bloqueo de activación. De esta manera, si se produce un error, será más fácil encontrar la ubicación en tu código fuente donde se creó el bloqueo de activación. Estas son otras sugerencias:
- No incluyas información de identificación personal (PII) en el nombre, como una dirección de correo electrónico. Si el dispositivo detecta PII en la etiqueta de bloqueo de activación, registra
_UNKNOWN
en lugar de la etiqueta que especificaste. - No obtengas el nombre de la clase o del método de forma programática, por ejemplo, llamando a
getName()
. Si intentas obtener el nombre de forma programática, es posible que herramientas como Proguard lo ofusquen. En su lugar, usa una cadena hard-coded. - No agregues un contador ni identificadores únicos a las etiquetas de bloqueo de activación. El código que crea un bloqueo de activación debe usar la misma etiqueta cada vez que se ejecuta. Esta práctica permite que el sistema agregue el uso del bloqueo de activación de cada método.
Asegúrate de que tu app sea visible en primer plano
Mientras un bloqueo de activación está activo, el dispositivo consume energía. El usuario del dispositivo debe estar al tanto de que esto está sucediendo. Por este motivo, si usas un bloqueo de activación, debes mostrarle una notificación al usuario. En la práctica, esto significa que debes obtener y mantener el bloqueo de activación en un servicio en primer plano. Los servicios en primer plano son obligatorios para mostrar una notificación.
Si un servicio en primer plano no es la opción correcta para tu app, es probable que tampoco debas usar un bloqueo de activación. Consulta la documentación sobre cómo elegir la API correcta para mantener el dispositivo activo y conocer otras formas de realizar tareas mientras tu app no está en primer plano.
Mantén la lógica simple
Asegúrate de que la lógica para adquirir y liberar los bloqueos de activación sea lo más simple posible. Cuando esta lógica se vincula a máquinas de estado complejo, tiempos de espera, grupos de ejecutores o eventos de devolución de llamada, cualquier error en dicha lógica, por pequeño que sea, puede hacer que el bloqueo de activación se mantenga más de lo esperado. Estos errores son difíciles de diagnosticar y depurar.
Verifica que el bloqueo de activación siempre se libere
Si usas un bloqueo de activación, debes asegurarte de que cada bloqueo de activación que adquieras se libere correctamente. No siempre es tan fácil como parece. Por ejemplo, el siguiente código tiene un problema:
Kotlin
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
acquire()
doTheWork() // can potentially throw MyException
release() // does not run if an exception is thrown
}
}
Java
void doSomethingAndRelease() throws MyException {
wakeLock.acquire();
doTheWork(); // can potentially throw MyException
wakeLock.release(); // does not run if an exception is thrown
}
El problema aquí es que el método doTheWork()
puede generar la excepción MyException
. Si es así, el método doSomethingAndRelease()
propaga la excepción hacia afuera y nunca llega a la llamada a release()
. El resultado es que se adquiere el bloqueo de activación, pero no se libera, lo que es muy malo.
En el código corregido, doSomethingAndRelease()
se asegura de liberar el bloqueo de activación incluso si se arroja una excepción:
Kotlin
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
try {
acquire()
doTheWork()
} finally {
release()
}
}
}
Java
void doSomethingAndRelease() throws MyException {
try {
wakeLock.acquire();
doTheWork();
} finally {
wakeLock.release();
}
}