Android: ¿Cómo liberar recursos cuando termina la aplicación?
He creado una aplicación que utiliza la cámara y durante la ejecución de la aplicación, la pantalla está siempre encendida.
En el método onCreate () agregué el bloqueo:
- Cómo encontrar View from string en vez de R.id
- ID de recursos de Android
- No se puede obtener recursos de la aplicación Android
- ¿Cómo uso los recursos predeterminados de Android en mi layout xml?
- Android: descarga la imagen desde la URL a la carpeta de activos
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 onStop () de overriden:
@Override protected void onStop() { if(mWakeLock.isHeld()) { mWakeLock.release(); } super.onStop(); }
Pero después de la terminación de la aplicación la pantalla permanece encendida todo el tiempo y si ejecuto la aplicación de la cámara encuentra un error que obviamente aparece porque los recursos de la cámara no son liberados.
¿Alguien sabe cómo liberar todos los recursos en la terminación de la aplicación?
- Android XML Cómo obtener un ID de recurso (entero) de XML
- Cambiar idioma mediante programación en Android
- Iconos de prioridad en la barra de acción
- Excepción en el ajuste del color de fondo
- Obtener ID de recurso de valor
- Tamaños de imagen de Android
- Lista completa de todas las carpetas de recursos de Android?
- Alcance de los valores de R.id
Me gustaría mover el bloqueo de OnCreate()
a OnResume()
. Desea el bloqueo durante la vida visible de la Actividad, no durante toda la vida de la Actividad. You Activity definitivamente podría estar corriendo con otra Actividad corriendo delante de ella.
Me gustaría mover el lanzamiento a OnPause()
. OnPause()
es el punto más temprano que su aplicación normalmente debería ser eliminada por el sistema operativo.
Además, no comprobaría para ver si tengo la cerradura antes de lanzar. Si utiliza OnResume()
para adquirir el bloqueo; isHeld
siempre debe ser verdadero en OnPause()
.
Suena como si su aplicación nunca está llamando a la liberación en el Wakelock
– es posible que está lanzando una excepción anterior en onStop
o onPause
? Incluiría un registro donde estás llamando a liberación para confirmar que está siendo ejecutado.
En cualquier caso, definitivamente querrá mover los métodos de acquire
y release
en onResume
y onPause
respectivamente. El código que obtenga sólo adquirirá el WakeLock la primera vez que se inicie su aplicación.
Gracias al fondo de Android de procesamiento de su código tiene un desequilibrio potencial. Si el usuario pulsa la tecla de inicio para cambiar de aplicación, se liberará el bloqueo. Si cambian de nuevo a su aplicación onCreate no se llamará, por lo que el bloqueo nunca será adquirido.
Su mejor opción es construir el WakeLock en onCreate (como usted tiene), adquirir el bloqueo onResume y liberarlo en onPause (incluyendo la llamada a isHeld). Esto garantizará que el bloqueo se llevará a cabo cada vez que su aplicación está en primer plano.
Yo uso mWakelock.setReferenceCounted (false), aún no sé lo que significa, pero resuelve mi problema "Wakelock under-locked".
Init: OnStart () adquiere: onResume () release: onStop ()
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 Arte
¿A dónde llamas finish ()?
Debería liberar sus recursos en onPause y no en onStop. No hay ninguna garantía de que onStop siempre será llamado antes de que su actividad sea asesinada. Si el sistema necesita recursos entonces puede matar la actividad antes de llamarse onStop.
Intente poner registros de depuración y rastrear la ruta de ejecución cuando crea que su aplicación está siendo finalizada.