Simular la muerte de la actividad en el emulador

Me gustaría probar onSaveInstanceState y onRestoreInstanceState para mi aplicación en el emulador.

Encontré esto , que dice que podríamos simular esto durante el cambio de orientación, pero estoy almacenando algunas de mis variables en el nivel de la 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 haber dejado en claro. Gracias

    Puede pausar su aplicación (presionando el botón de Inicio, simulando una llamada, lo que sea). Luego mata el proceso de la aplicación a través de adb. Dado que los documentos dicen que después de que onPause () regrese su aplicación puede ser eliminada sin previo aviso, esta es una prueba justa.

    Para probar los eventos onSaveInstanceState y onRestoreInstanceState, puede usar la utilidad SetAlwaysFinish (ver el enlace a continuación). Utiliza una configuración de sistema oculta llamada Always Finish para cambiar el comportamiento del sistema Android. Con la opción Always Finish (Finalizar siempre) habilitada, el sistema operativo Android descargará inmediatamente cualquier actividad que se mueva de primer plano a segundo plano, activando su evento onSaveInstanceState. Luego, cuando el sistema necesita la actividad nuevamente, se ve obligado a volver a cargarlo y desencadenar el evento onRestoreInstanceState.

    La ventaja de este método en comparación con matar el proceso es que es más fácil y obtienes un control más preciso (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 usarla: http://bricolsoftconsulting.com/how-to-test-onsaveinstancestate-and-onrestreinstancestate-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 usar la configuración “No guardar actividades” en la configuración del desarrollador o matar el proceso de la aplicación usted mismo.

    Para matar el proceso, abra la actividad que desea probar, luego presione el botón de inicio para enviar su aplicación al fondo y luego, usando DDMS en Android Studio (Android Device Monitor), seleccione el proceso y luego detenga el proceso (como se ve) en la imagen a continuación). Tu aplicación fue asesinada. Ahora, abra su aplicación nuevamente (acceda a la lista de aplicaciones abiertas). Ahora puedes probar el estado asesinado.

    enter image description here

    Permite aclarar tu pregunta.

    Pero antes de hacer eso aquí hay un hecho sobre onSaveInstanceState: se llama por varias razones, tales como:

    • cambio de orientación
    • yendo de primer plano a fondo (haciendo clic en Inicio o iniciando otra actividad o haciendo clic en recientes)
    • el sistema tiene poca memoria

    Ahora, si su pregunta es “¿cómo puedo simular la invocación de onSaveInstance solo con fines de prueba?”, La respuesta de Theo y Ted es correcta. Tanto cambiar la opción de configuración del desarrollador como presionar Inicio resultará en que se invoque a GuardarInstancia.

    Pero también cambiaría la orientación (como lo mencionó en su pregunta), lo que me lleva a pensar que podría estar preguntándose “¿cómo puedo simular la invocación del método onSaveInstance cuando el sistema está bajo presión de memoria baja”?

    La respuesta corta a esta pregunta es que no existe una forma automatizada para simular condiciones de poca memoria. Las técnicas mencionadas anteriormente solo simulan la invocación del método onSaveInstanceState, no las condiciones de baja memoria per se

    Un par de advertencias aquí.

    La primera advertencia a esto es que bajo condiciones extremas, el kernel matará “imprudentemente” su proceso para reclamar memoria, lo que significa que nunca se llamará a OnSaveInstanceState. En esta situación, las pruebas en SaveInstanceState son irrelevantes. No hay mucho que puedas hacer sobre este escenario, pero la buena noticia es que es un evento muy raro especialmente. para actividades en primer plano.

    La segunda advertencia es que ActivityManager puede reclamar el recurso de tu actividad “eliminándola limpiamente”, es decir, se llamará a onSaveInstance. Esto sucede con actividades que no están en primer plano (es decir, que no son visibles para el usuario, por lo que ya están paradas) y el sistema está bajo presión de memoria.

    En esta segunda advertencia, nuevamente no se puede simular esta condición automáticamente. Se puede hacer si inicia muchas actividades pesadas de forma manual y espera que el ActivityManager se vea obligado a reciclar una de sus actividades.

    El punto más importante que hay que recordar aquí es que no hay necesidad de simular condiciones de poca memoria. Siempre que esté simulando cómo se llama onSaveInstanceState, está probando automáticamente la condición en la que podría llamarse para 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á usando un dispositivo real para cambiar temporalmente la configuración del desarrollador (“No mantener actividades”)

    Hay una solución más sólida para esto en Android 6 y más reciente. Utilicé el siguiente método con éxito en Android 6, 7 y 8:

    1) Abra su aplicación, vaya a la actividad que desea probar restaurar y luego déjela presionando el botón de Inicio

    2) Abra la aplicación Configuración, vaya a Sistema -> Opciones de desarrollador, luego toque “Ejecutar servicios”

    3) Toque “Mostrar procesos almacenados en caché” en la parte superior derecha, luego encuentre su aplicación en la lista, toque y luego toque el botón “Parar”.

    4) Utiliza la lista de aplicaciones recientes para regresar a tu aplicación. Debería reiniciar toda la aplicación en la actividad de la que anteriormente la había dejado.

    Descubrí que esto es suficiente para matar completamente la aplicación, incluidos los elementos delegates de la aplicación y el estado del código C / C ++ nativo, y luego probar el relanzamiento con un estado de actividad guardado … Esto replica efectivamente lo que sucede cuando el usuario se va la aplicación por un tiempo y luego el sistema lo mata para ahorrar memoria, batería o lo que sea.

    Desde el documento de Android, http://developer.android.com/reference/android/content/ComponentCallbacks.html#onLowMemory ()

    Esto es activado por el sistema. Creo que puede configurar el tamaño de ram de dispositivo más bajo durante la creación de un dispositivo virtual de Android. (En Hardware, elija “Tamaño de ram de dispositivo”)

    La solución más simple que funciona para mí es simplemente cambiar la orientación del dispositivo (puede hacerlo sin importar si está usando AVD, Genymotion o cualquier otro emulador). Por defecto, el sistema volverá a crear la Activity invocando onDestory seguido de onCreate .

    Asegúrese de que la Activity no haya definido el atributo a continuación en AndroidManifest.xml

     android:configChanges="orientation"