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.

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.

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) { } } } } 
  • ¿El sistema operativo Android libera un wakelock si la aplicación o el servicio que lo contiene se destruye?
  • Actualizaciones de ubicación de fondo android y wakelock
  • ¿Cómo usar Wake Lock para android mediaplayer?
  • BroadcastReceiver, Servicio y Wakelock
  • Temporizador Se ralentiza en Servicio cuando se bloquea la pantalla del dispositivo
  • ¿Un GCM-App realmente necesita un wakelock?
  • ¿Traer la aplicación al frente, activar la visualización y desbloquear desde AlarmManager?
  • ¿Cómo desactiva Android Wear cuando está en modo de suspensión?
  • ¿Debería llamar a WakeLock antes de crear una notificación?
  • Despierta Android Phone / tablet?
  • AlarmManager no siempre ejecuta BroadcastReceiver
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.