2009-07-01 22 views
13

Creé una aplicación que usa la cámara y durante la ejecución de la aplicación la pantalla está siempre encendida.Android: ¿Cómo liberar recursos cuando finaliza la aplicación?

En el método onCreate() que añade el bloqueo:

final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag"); 
this.mWakeLock.acquire(); 

Y este es el método sobreescrito onStop():

@Override 
protected void onStop() { 

    if(mWakeLock.isHeld()) 
    { 
     mWakeLock.release(); 
    } 

    super.onStop(); 
} 

Pero después de la finalización de la aplicación de la pantalla permanece en toda la tiempo y si ejecuto la aplicación de la cámara se encuentra con un error que obviamente aparece porque los recursos de la cámara no se liberan.

¿Alguien sabe cómo liberar todos los recursos en la terminación de la aplicación?

Respuesta

13

Me gustaría mover el bloqueo de OnCreate() a OnResume(). Desea el bloqueo durante la vida visible de la actividad, no la duración total de la actividad. Tu actividad podría seguir ejecutándose definitivamente con otra actividad ejecutándose en frente de ella.

que se movería la liberación de OnPause(). OnPause() es el primer punto que su aplicación debería ser eliminada por el sistema operativo.

Además, no me comprobar para ver si tengo la cerradura antes de soltarla. Si usa OnResume() para adquirir el candado; isHeld siempre debe ser cierto en OnPause().

+1

Su sugerencia para no comprobación de estado de bloqueo está bien si la liberación() es una operación idempotente. Si no, es malo. ¿Qué sucede si la aplicación no pudo obtener el bloqueo y desea cerrar la aplicación? – Thushan

+1

Gran comentario. Miré el código fuente de Android. Parece que la única forma en que no puede obtener un bloqueo es si deforma su llamada, en cuyo caso registra un error pero no lanza una excepción. Si llama a release() sin adquirir un candado, emitirá una excepción "WakeLock under-locked". La documentación de acquire() lleva a uno a pensar que si solicita el bloqueo, obtendrá el bloqueo. Pero si debe verificar, entonces debe verificar inmediatamente después de adquirir(), no después de que el programa se haya ejecutado y esté a punto de salir. – Will

1

¿A dónde llamas terminar()?

usted debe estar liberando sus recursos en onPause y no en onStop. No hay garantía de que siempre se llame a OnStop antes de que se mate su actividad. Si el sistema necesita recursos, puede matar la actividad antes de llamar a onStop.

tratar de poner los registros de depuración y traza la ruta de ejecución cuando se piensa que su solicitud está siendo terminado.

3

Parece que su aplicación nunca está llamando al lanzamiento en el Wakelock - ¿es posible que esté lanzando una excepción antes en onStop o ? Incluiría algunos registros en los que está llamando a la versión para confirmar que se está ejecutando.

En cualquier caso, que sin duda querrá mover los métodos acquire y release en onResume y respectivamente. El código que tienes solo adquirirá WakeLock la primera vez que inicies tu aplicación.

Gracias fondo del androide procesar su código tiene un desequilibrio potencial. Si el usuario presiona la tecla de inicio para cambiar de aplicación, se liberará el bloqueo. Si vuelven a su aplicación, no se llamará a Crea, por lo que nunca se adquirirá el bloqueo.

Su mejor opción es construir el WakeLock en onCreate (como usted tiene), adquirir el candado en Reanudar y soltarlo en OnPause (incluida la llamada a isHeld). Esto garantizará que el bloqueo se llevará a cabo siempre que su aplicación esté en primer plano.

2

Tuve problemas para liberar datos cuando estaba usando OpenGL. Así que ahora, con android.os.Process.killProcess (android.os.Process.myPid()); ¡funciona como yo quiero!

Gracias Art

3

utilizo mWakelock.setReferenceCounted (falso), todavía sé qué significa, sino que resuelve mi problema "Wakelock bajo-bloqueado".

Init: OnStart() adquirir: onResume() liberación: onStop()

Cuestiones relacionadas