Android – Wake lock no se está adquiriendo correctamente, la aplicación debe seguir funcionando en modo de espera
En mi aplicación, en el método onCreate () de la actividad principal estoy creando un bloqueo de vigilia para que la CPU siga funcionando si el teléfono se enciende standb / pantalla se apaga.
También en el método onCreate tengo la intención de crear un servicio que utilice el acelerómetro. Este servicio necesita estar continuamente funcionando mientras la aplicación está abierta y monitoreando los valores del acelerómetro (sé que esto no es bueno para la batería pero lo necesito para hacerlo). Aquí está mi código en este momento y el servicio comienza bien.
- Android - ¿Cómo puedo despertar el teléfono de un sueño duro para tomar una foto?
- Pantalla tenue mientras el usuario está inactivo
- Android: apaga la pantalla sin activar la pantalla de suspensión / bloqueo - Activar con pantalla táctil
- ¿Cómo las notificaciones necesitan WAKE_LOCK en android?
- PARTIAL_WAKE_LOCK vs SCREEN_DIM_WAKE_LOCK en el subproceso de descarga
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Howaya"); wl.acquire(); if (appStart == true) { Intent AccelService = new Intent(this, Accelerometer.class); AccelService.putExtra("unreg", false); startService(AccelService); } appStart = false; }
Tengo el siguiente permiso establecido en mi manifiesto –
<uses-permission android:name="android.permission.WAKE_LOCK" />
He intentado esto con cerraduras diferentes – la pantalla tenue y el brillo completo no sirvió también. Mi salida en logcat está aquí –
F/PowerManager(15628): android.util.Log$TerribleFailure: WakeLock finalized while still held: Howaya F/PowerManager(15628): at android.util.Log.wtf(Log.java:260) F/PowerManager(15628): at android.util.Log.wtf(Log.java:239) F/PowerManager(15628): at android.os.PowerManager$WakeLock.finalize(PowerManager.java:329) F/PowerManager(15628): at dalvik.system.NativeStart.run(Native Method)
He visto a personas diciendo que los wakelocks parciales no funcionan como deberían hacer, como este enlace de Google página de error en espera, pero esto fue lanzado y cerrado el año pasado por lo que no sé es que el caso, ¿alguien puede ayudar aquí por favor? Tengo un deseo de HTC con respecto a ese último punto también, gracias.
- ¿Debo usar WakeLock en IntentService?
- WakeLock finalizó mientras seguía teniendo error aunque lo estoy lanzando
- Si un wakelock es adquirido y mi aplicación se bloquea, ¿qué debo hacer?
- BroadcastReceiver Vs WakefulBroadcastReceiver
- ¿Es Wakelock de Android una necesidad para los servicios de fondo?
- Cómo mantener el dispositivo Android de dormir mientras está conectado
- Cómo mantener el vibrador encendido indefinidamente de un servicio o receptor
- Eliminar el permiso WAKE_LOCK no deseado fusionado de la biblioteca
En mi aplicación, en el método onCreate () de la actividad principal estoy creando un bloqueo de vigilia para que la CPU siga funcionando si el teléfono se enciende standb / pantalla se apaga.
Por favor, utilice android:keepScreenOn
en uno de los widgets de su diseño. Eso es mucho, mucho más seguro para las actividades que tratar manualmente con un WakeLock
. Además, no necesita el permiso de WAKE_LOCK
entonces, IIRC.
Mi salida en logcat está aquí
Ese error es porque nunca WakeLock
el WakeLock
. Por favor no WakeLocks
.
Ahora, se las arregló para escribir toda esta prosa e incluir todos estos listados, y se le olvidó una pequeña cosa: en realidad nos dice cuál es su pregunta . Este es un elemento bastante importante para un sitio de preguntas y respuestas como StackOverflow. Y, no, "¿alguien puede ayudar aquí por favor?" No cuenta como una pregunta cuando usted nunca define qué "ayuda" es que usted está mirando para recibir.
Se produce un problema porque su objeto WakeLock es una variable de ámbito local dentro del método OnCreate. Después de ejecutar el método – el objeto WakeLock no está más referenciado – por lo tanto, es elegible para la recolección de basura. Si ocurre el Dalvik GC – el objeto está listo para finalizar – y el código interno del finalizador le advierte, que WakeLock todavía está retenido – y activo – pero será GC'ed. Debe obtener un nuevo objeto WakeLock y asignarlo a un campo del tipo de clase WakeLock en su clase derivada de la actividad. Lea acerca de la programación orientada a objetos y Garbage Collector – Usted comprenderá el problema.
Como dijo @Michal P, usted adquiere un wakelock en el método onCreate, pero nunca lo libera.
Cuando GC escanea este objeto de referencia cero, el método de finalización por defecto de llamada, pero en realidad está activo.
@Override protected void finalize() throws Throwable { synchronized (mToken) { if (mHeld) { Log.wtf(TAG, "WakeLock finalized while still held: " + mTag); Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0); try { mService.releaseWakeLock(mToken, 0); } catch (RemoteException e) { } } } }
- No se puede hacer referencia a otro ID de vista en vinculación de datos de Android
- Quitar sombra de la barra de herramientas cuando el cajón de navegación está abierto – Biblioteca de soporte de diseño de material