Cómo simular Android matando mi proceso

Android matará un proceso si está en segundo plano y el sistema operativo decide que necesita los recursos (RAM, CPU, etc.). Tengo que ser capaz de simular este comportamiento durante las pruebas para que pueda asegurar que mi aplicación se está comportando correctamente. Quiero ser capaz de hacer esto de una manera automatizada para que pueda probar si la aplicación se comporta correctamente siempre que esto suceda, lo que significa que voy a tener que probar esto en cada actividad, etc

Sé cómo matar a mi proceso. Ese no es el problema. El problema es que cuando mato mi proceso (usando DDMS, adb shell kill anuncios, Process.killProcess() , etc.) Android no lo reinicia de la misma manera que si el sistema operativo Android lo hubiera matado.

Si el sistema operativo Android mata el proceso (debido a los requerimientos de recursos), cuando el usuario vuelve a la aplicación, Android volverá a crear el proceso y volverá a crear la actividad superior en la pila de actividades (llamando onCreate() ).

Por otro lado, si mato el proceso, Android asume que la actividad en la parte superior de la pila de actividades se comportó mal , por lo que automáticamente recrea el proceso y luego elimina la actividad superior de la pila de actividad y recrea la actividad que estaba debajo La actividad superior (llamando onCreate () `). Este no es el comportamiento que quiero. Quiero el mismo comportamiento que cuando Android mata el proceso.

Sólo para explicar pictóricamente, si mi pila de actividad se parece a esto:

  ActivityA -> ActivityB -> ActivityC -> ActivityD 

Si Android mata el proceso y el usuario vuelve a la aplicación, Android recrea el proceso y crea ActivityD.

Si mato el proceso, Android recrea el proceso y crea ActivityC.

La mejor manera de probar esto para mí era hacer esto:

  • Open ActivityD en su aplicación
  • Presione el botón Inicio
  • Presione Detener en DDMS en su aplicación (esto destruirá el proceso de la aplicación)
  • Regresar a la aplicación con la aplicación Home larga o las aplicaciones abiertas (depende del dispositivo)
  • La aplicación comenzará en ActivityD recreado (ActivityA, ActivityB, ActivityC están muertos y se recrearán cuando regrese a ellos)

En algunos dispositivos también puede volver a la aplicación (ActivityD) con Aplicaciones -> Su icono de lanzamiento, pero en otros dispositivos se iniciará la ActivityA en su lugar.

Esto es lo que los documentos Android están diciendo sobre eso:

Normalmente, el sistema borra una tarea (elimina todas las actividades de la pila por encima de la actividad raíz) en determinadas situaciones cuando el usuario vuelve a seleccionar esa tarea desde la pantalla de inicio. Normalmente, esto se hace si el usuario no ha visitado la tarea durante un tiempo determinado, como 30 minutos.

Esto parece funcionar para mí:

 adb shell am kill <package_name> 

Esto es diferente a la adb shell kill mencionada por el OP.

Tenga en cuenta que la ayuda para el comando am kill dice:

 am kill: Kill all processes associated with <PACKAGE>. Only kills. processes that are safe to kill -- that is, will not impact the user experience. 

Por lo tanto, no va a matar el proceso si está en primer plano. Esto parece funcionar como el OP quería en que si navego lejos de mi aplicación, a continuación, ejecute adb shell am kill <package_name> que va a matar la aplicación (he confirmado esto usando ps en el dispositivo). Entonces, si vuelvo a la aplicación estoy de vuelta en la actividad que estaba antes – es decir, en el ejemplo del OP el proceso se vuelve a crear y crea ActivityD (en lugar de ActivityC como la mayoría de los otros métodos de matar parecen activar).

Lo siento estoy un par de años tarde para el OP, pero espero que otros encontrarán esto útil.

En las opciones de desarrollador en Configuración, seleccione "No mantener actividades", que destruirá las actividades tan pronto como navegue lejos de ellas.

Otro método, probablemente uno que es programable ya que no requiere DDMS:

Configuración única: vaya a Opciones del desarrollador, seleccione Configuración del límite de proceso en segundo plano, cambie el valor de "Límite estándar" a "Sin procesos de fondo".

Cuando necesite reiniciar el proceso, presione el botón de inicio. El proceso se matará (se puede verificar en logcat / Android Monitor en estudio – el proceso se marcará [MUERTO]). A continuación, vuelve a la aplicación mediante el selector de tareas.

Esta pregunta es antigua, pero hay una respuesta para esta pregunta que no requiere adb, Android Studio, etc El único requisito es API 23 o más reciente.

Para simular la reinicialización de la aplicación por sistema operativo, ve a la configuración de la aplicación mientras la aplicación se está ejecutando, deshabilita (puedes habilitar) un permiso y devuelve la aplicación desde aplicaciones recientes. Cuando se deshabilita el permiso, el sistema operativo elimina la aplicación pero mantiene los estados de instancia guardados. Cuando el usuario devuelve la aplicación, se vuelve a crear la aplicación y la última actividad (con estado guardado).

El método "Sin procesos de fondo" a veces causa el mismo comportamiento, pero no siempre. Por ejemplo, si la aplicación está ejecutando un servicio de fondo, "Sin procesos de fondo" no hace nada. Pero la aplicación se puede matar por el sistema, incluyendo sus servicios. El método de permiso funciona incluso si la aplicación tiene un servicio.

Ejemplo:

Nuestra aplicación tiene dos actividades. ActivityA es la actividad principal que se inicia desde el lanzador. ActivityB se inicia desde ActivityA. Mostraré sólo métodos onCreate, onStart, onStop, onDestroy. Android llama a OnSaveInstanceState siempre antes de llamar a onStop, porque una actividad que está en estado de parada puede ser destruida por el sistema. [ https://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle%5D

Método de permiso:

 <start app from launcher first time> Application onCreate ActivityA onCreate WITHOUT savedInstance ActivityA onStart <open ActivityB> ActivityB onCreate WITHOUT savedInstance ActivityB onStart ActivityA onStop (the order is like this, it is stopped after new one is started) <go settings> ActivityB onStop <disable a permission> //Application is killed, but onDestroy methods are not called. //Android does not call onDestroy methods if app will be killed. <return app by recent apps> Application onCreate (this is the important part. All static variables are reset.) ActivityB onCreate WITH savedInstance (user does not notice activity is recreated) //Note that ActivityA is not created yet, do not try to access it. ActivityB onStart <return ActivityA by back> ActivityA onCreate WITH savedInstance (user does not notice activity is recreated) ActivityA onStart ActivityB onStop ActivityB onDestroy <press back again, return launcher> ActivityA onStop ActivityA onDestroy <open app again> //does not call Application onCreate, app was not killed ActivityA onCreate WITHOUT savedInstance ActivityA onStart 

Quiero comparar otros métodos que se mencionan en las otras respuestas.

No mantenga actividades: Esto no mata la aplicación.

 <start app from launcher first time> Application onCreate ActivityA onCreate WITHOUT savedInstance ActivityA onStart <open ActivityB> ActivityB onCreate WITHOUT savedInstance ActivityB onStart ActivityA onStop ActivityA onDestroy (do not keep) <return launcher by home button> ActivityB onStop ActivityB onDestroy (do not keep) <retun app from recent apps> // NO Application onCreate ActivityB onCreate WITH savedInstance (user does not notice activity recreated) ActivityB onStart <return ActivityA by back> ActivityA onCreate WITH savedInstance (user does not notice activity recreated) ActivityA onStart ActivityB onStop ActivityB onDestroy <press back again, return launcher> ActivityA onStop ActivityA onDestroy <open app again> //does not call Application onCreate, app was not killed ActivityA onCreate WITHOUT savedInstance ActivityA onStart 

Método de parada de fuerza: no almacena estados de instancia guardados

 <start app from launcher first time> Application onCreate ActivityA onCreate WITHOUT savedInstance ActivityA onStart <open ActivityB> ActivityB onCreate WITHOUT savedInstance ActivityB onStart ActivityA onStop <go settings> ActivityB onStop <force stop, return app from recent apps> Application onCreate ActivityA onCreate WITHOUT savedInstance //This is important part, app is destroyed by user. //Root activity of the task is started, not the top activity. //Also there is no savedInstance. 

Parece que desea probar onSaveInstanceState y onRestoreInstanceState .

Pruebas en dispositivos reales: eche un vistazo a la aplicación SetAlwaysFinish .

Prueba en el emulador: checkout Destruir inmediatamente las actividades en la aplicación Dev Tools en el emulador de Android.

A todos, sólo quería hacerles saber sobre este documento que encontré:

http://developer.android.com/tools/testing/activity_testing.html

No puedo decir con certeza del 100% que hay un método de matar aquí exactamente igual que Android, pero, es el comienzo. Puede simular muchas partes del ciclo de vida de la actividad aquí, por lo que debería ser capaz de simular la muerte de un proceso.

También aquí hay un tutorial: http://developer.android.com/tools/testing/activity_test.html#StateManagementTests

Espero que esto ayude. Aclamaciones

Puede realizar los siguientes pasos para reproducir el comportamiento buscado:

  1. Abre tu aplicación, navega a la actividad principal
  2. Utilice el panel de notificaciones para navegar a cualquier otra aplicación de pantalla completa (por ejemplo, a la configuración del sistema, en la esquina superior derecha)
  3. Mata tu proceso de solicitud
  4. Presione el botón Atrás

Estoy muy tarde para la fiesta y varios antes de mí dio la misma respuesta correcta, pero para simplificar para quien viene después de mí sólo presione botón de inicio y ejecutar este comando:

adb shell ps | grep <package name> | awk '{print $2}' | xargs adb shell run-as <package name again> kill

La aplicación no perderá el estado y de mi propia experiencia esto funciona de la misma manera que el sistema operativo mató la aplicación en el fondo. Esto sólo funciona para aplicaciones de depuración

Así es como lo haces en Android Studio.

  1. Haga que su dispositivo esté en modo de depuración conectado a su computadora.
  2. Abra la aplicación en su dispositivo y vaya a la actividad que desee probar la "Volver a ella de entre los muertos".
  3. Presione el botón Inicio en su dispositivo.
  4. En Android Studio, vaya a Android Monitor -> Monitors y pulse el icono Terminate Application.
  5. Ahora puedes volver a tu aplicación a través de las aplicaciones recientes o al hacer clic en el ícono del lanzador, el comportamiento ha sido el mismo en mis pruebas.

La raíz de tu problema parece ser que tu Activity está en primer plano cuando matas el proceso.

Puede observar esto presionando detener en DDMS cuando Activity es visible (sucede exactamente lo que usted describe) y comparándolo con presionar detener después de casa y luego regresar a la aplicación.

Sólo asegúrese de moveTaskToBack(true) alguna manera en sus pruebas.

Pulse el botón Inicio y, en primer lugar, coloque la aplicación en segundo plano. A continuación, detenga o anule el proceso de DDMS o ADB.

No estoy seguro de que esta es la respuesta que buscas, es más como una lógica pensar.

No creo que puedas hacer una prueba completamente automatizada, la única manera de simularla, será recrearla, AKA tiene tantas actividades que Android matará tu aplicación.

Así que mi idea o sugerencia es hacer otra pequeña aplicación, que sigue apareciendo nuevas actividades, hasta que Android se queda sin memoria y comenzar a matar el proceso que el fondo.

Algo entre la línea:

Inicie la actividad i -> Compruebe el proceso en ejecución si la aplicación está en la lista, incremente i y reinicie el bucle sin cerrar la actividad actual, sino -> disminuya i y cierre la actividad actual, vuelva a la anterior y vuelva a revisar …

También puede conectarse a su dispositivo / emulador desde el terminal con adb shell , a continuación, obtener PID de su proceso con ps | grep <your_package_name ps | grep <your_package_name y ejecute kill -9 <pid> . A continuación, abra la aplicación minimizada desde el selector de aplicaciones recientes y se reiniciará la última actividad

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.