android - savedinstancestate - Simular matanza de actividad en emulador.
onstart android example (7)
Me gustaría probar onSaveInstanceState
y onRestoreInstanceState
para mi aplicación en el emulador.
Encontré this , que dice que podríamos simular esto durante el cambio de orientación, pero estoy almacenando algunas de mis variables en el nivel de aplicación (subclase android.app.Application
), por lo que el cambio de orientación no borra las variables.
Entonces, mi pregunta es, ¿cómo puedo simular la situación de poca memoria matando así mis actividades?
Espero que me haya dejado claro. Gracias
Desde android doc, http://developer.android.com/reference/android/content/ComponentCallbacks.html#onLowMemory ()
Esto es activado por el sistema. Creo que puede configurar el tamaño del dispositivo ram más bajo durante la creación de un dispositivo virtual de Android. (En Hardware, seleccione "Tamaño de dispositivo RAM")
Hay una solución más sólida para esto en Android 6 y más reciente. He utilizado con éxito el siguiente método en Android 6, 7 y 8:
1) Abra su aplicación, vaya a la actividad que desea probar para restaurar y luego déjela presionando el botón Inicio.
2) Abra la aplicación de configuración, vaya a Sistema -> Opciones de desarrollador, luego toque en "Servicios en ejecución"
3) Toque "Mostrar procesos en caché" en la parte superior derecha, luego encuentre su aplicación en la lista, toque en ella y luego toque el botón "Detener".
4) Utilice la lista de aplicaciones recientes para volver a su aplicación. Debería relanzar toda la aplicación en la actividad de la que lo había dejado anteriormente.
Descubrí que esto es suficiente para eliminar por completo la aplicación, incluidas las cosas del delegado de la aplicación y el estado del código nativo de C / C ++, y luego probar relanzarla con un estado de actividad guardada ... Esto efectivamente replica lo que sucede cuando el usuario se retira La aplicación durante un tiempo y luego el sistema la mata para ahorrar memoria, batería o lo que sea.
La solución más sencilla que funciona para mí es simplemente cambiar la orientación del dispositivo (puede hacerlo independientemente de que esté utilizando AVD, Genymotion o cualquier otro emulador). Por defecto, el sistema recreará la Activity
llamando a onDestory
seguido de onCreate
.
Asegúrese de que la Activity
no haya definido el atributo a continuación en AndroidManifest.xml
android:configChanges="orientation"
Para probar los eventos onSaveInstanceState y onRestoreInstanceState, puede usar la utilidad SetAlwaysFinish (vea el enlace a continuación). Utiliza una configuración de sistema oculta llamada Siempre terminar para cambiar el comportamiento del sistema Android. Con la opción Finalizar siempre habilitada, el sistema operativo Android descargará inmediatamente cualquier actividad que se mueva desde el primer plano al fondo, activando su evento onSaveInstanceState. Luego, cuando el sistema vuelve a necesitar la actividad, se ve obligado a volver a cargarla y se activa el evento onRestoreInstanceState.
La ventaja de este método en comparación con matar el proceso es que es más fácil y se obtiene un mejor control (nivel de actividad en lugar de nivel de proceso).
Consulte la publicación del blog a continuación para obtener más detalles sobre la herramienta y cómo utilizarla: http://bricolsoftconsulting.com/how-to-test-onsaveinstancestate-and-onrestoreinstancestate-on-a-real-device/
La función Finalizar siempre también está presente en el emulador en la aplicación DevTools en Configuración de desarrollo> Destruir actividades inmediatamente. Sin embargo, la aplicación DevTools no funciona fuera del emulador.
Puede pausar su aplicación (presionando el botón Inicio, simulando una llamada, lo que sea). Luego mata el proceso de la aplicación a través de adb. Ya que los documentos dicen que después de que onPause () devuelva su aplicación puede ser cancelada sin previo aviso, esta es una prueba justa.
Puedes usar la configuración "No mantener las actividades" en la configuración del desarrollador o cancelar el proceso de la aplicación por ti mismo.
Para finalizar el proceso, abra la actividad que desea probar, luego presione el botón de inicio para enviar su aplicación al fondo, y luego, utilizando DDMS en Android Studio (Monitor de dispositivo Android), seleccione el proceso y luego deténgalo (como se ve) en la imagen de abajo). Tu aplicación fue asesinada. Ahora, abra su aplicación nuevamente (acceda a la lista de aplicaciones abiertas). Ahora puedes probar el estado muerto.
Vamos a aclarar su pregunta.
Pero antes de hacer eso, aquí hay un hecho sobre onSaveInstanceState: se llama por varios motivos, como por ejemplo:
- cambio de orientación
- pasando de primer plano a segundo plano (haciendo clic en inicio o iniciando otra actividad o haciendo clic en recientes)
- el sistema está bajo de memoria
Ahora, si tu pregunta es "¿Cómo puedo simular la llamada de onSaveInstance solo para propósitos de prueba?" Entonces la respuesta de Theo y Ted es correcta. Al cambiar la opción de configuración del desarrollador o al presionar inicio, se llamará onSaveInstance.
Pero también cambiaría la orientación (como anotó en su pregunta), lo que me lleva a creer que podría estar preguntando "¿Cómo puedo simular la llamada del método onSaveInstance cuando el sistema está bajo la presión de memoria baja?"
La respuesta corta a esta pregunta es que no hay una forma automatizada de simular una condición de memoria baja. Las técnicas mencionadas anteriormente solo simulan la llamada del método onSaveInstanceState, no las condiciones de memoria bajas per se
Un par de advertencias aquí.
La primera advertencia a esto es que bajo condiciones extremas el kernel "impureza" eliminará su proceso para reclamar memoria, lo que significa que nunca se llamará onSaveInstanceState. En estas situaciones, probar onSaveInstanceState es discutible. No hay mucho que puedas hacer al respecto, pero la buena noticia es que es un evento muy raro, especialmente. para las actividades de primer plano.
La segunda advertencia es que ActivityManager puede reclamar el recurso de su actividad "matándolo limpiamente", es decir, se llamará a su onSaveInstance. Esto sucede con las actividades que no están en primer plano (es decir, no son visibles para el usuario, por lo que ya están en estado detenido) y el sistema está bajo presión de memoria.
En esta segunda advertencia, de nuevo, no puedes simular esta condición automáticamente. Se puede hacer si inicia muchas actividades de servicio pesado manualmente y espera que el ActivityManager se vea obligado a reciclar una de sus actividades.
El punto más importante para recordar aquí es que no es necesario simular una condición de memoria baja. Mientras esté simulando cómo se llama onSaveInstanceState, estará probando automáticamente la condición en la que podría llamarse en situaciones de poca memoria. Y la forma más fácil de activar este método es cambiar la orientación en el emulador (ctrl-f11). Y si está utilizando un dispositivo real para cambiar temporalmente la configuración del desarrollador ("No guardar actividades")