Cuando Android mata una aplicación, ¿se puede detener una función a mitad de camino?

Me pregunto: cuando una aplicación se va a matar, ¿espera Android que la función actualmente en ejecución vuelva, o Android para antes de que termina por sí mismo?

El sistema operativo elimina el proceso JVM, con todas las "funciones" en todos los subprocesos. En términos prácticos, no debe asumir que un método es una transacción. En su lugar, uno debe asumir que puede ser terminado en cualquier momento y diseñar adecuadamente.

Actualizado: Después de probar, Android matará cualquier thread / AsynTask que se esté ejecutando actualmente (sin llamar onPostExecute () / onCancelled ());

Si cierra la aplicación normalmente. Su ui-thread se detiene, pero si implment su método en un Thread / AsyncTask / Service, continuará funcionando hasta que termine.
Sin embargo, su Thread / AsyncTask puede continuar ejecutándose, pero puede o no ser completamente funcional si tiene una llamada de regreso de su instancia de la aplicación o hacer algo al ui de la aplicación. Esto PUEDE darle una excepción dependiendo de lo que se está haciendo.

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new Thread(new Runnable() { @Override public void run() { try { int i = 0; while (true) { i++; Thread.sleep(2000); Log.i("not dead", "not dead" + i); } } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } 

Ejecutar este código, e ir a jugar algunos juegos. Los resultados fueron el hilo que mató el sistema.

Su aplicación puede ser destruida por el sistema en cualquier momento sin que se ejecute otra línea de su código. De acuerdo con la documentación sin embargo, hay algunos métodos que no son "killable":

  • OnCreate ()
  • OnRestart ()
  • OnStart ()
  • En resumen()
  • OnPause ()

Como onDestroy () no se llamará con seguridad, es más guardar para usar el método onPause () para escribir los datos persistentes en el almacenamiento:

 protected void onPause(){ super.onPause(); if(isFinishing()){ // store data } } 

Cada aplicación para Android se ejecuta en una máquina virtual de Dalvik separada. Y cuando androide mata esa aplicación, destruye esa instancia de VM. Y no se preocupa por los hilos que está utilizando o lo que están haciendo, puede probar fácilmente que, mediante la creación de un socket tcp servidor que bloqueará hasta que un cliente se conecta y luego matar la aplicación, no pasa nada, no aumento de excepción de interrupción o Nada porque la instancia de la máquina virtual se mata.

Android puede eliminar tu aplicación en cualquier momento y en cualquier momento. Sin embargo, Android intenta mantener tu aplicación en ejecución si tiene recursos suficientes para ello o si tienes actividad en primer plano o servicio.

Antes de matar tu aplicación, Android llamará a los métodos de ciclo de vida de tus componentes de acuerdo con la documentación de SDK. No todos los métodos del ciclo de vida están garantizados para ser llamados.

Tendría sentido que mataría un método a mediados de la ejecución. Considere que muchas "cuelgan" se deben a una condición de bucle infinito dentro del bucle de un solo método. ¿De qué otro modo un sistema operativo mataría una aplicación así sin matarla en medio de la ejecución de un método?

También considere esto: Incluso si un sistema operativo permitió que el método "actual" terminara de ejecutar antes de matar la aplicación, y luego mató la aplicación, entonces estaría matando a la aplicación en medio del método que había llamado el primer método que el sistema operativo Permitió continuar ejecutando hasta que terminó. OK, entonces continúe este pensamiento hasta el extremo. Si el sistema operativo permitió que cada función que estaba en medio de la ejecución terminara antes de matar la aplicación, entonces el resultado final es que el sistema operativo permite que la aplicación completa se ejecute hasta completarse, lo que es exactamente lo que matar una aplicación se supone que eludirá. Por lo tanto, un sistema operativo, al matar una aplicación, debe terminar en el centro de "a" … acutally "muchas" …. funciones. ¡Cada función que está en la llamada no tiene la oportunidad de terminar!

Realmente depende del método de matar. ¿Matar debido a un accidente? Todos los hilos se detienen dondequiera que estén. Matar debido a temporizador de vigilancia? Todos los hilos muertos dondequiera que estén. ¿Matado debido al cierre de la actividad por el usuario? Las actividades / los hilos terminarán lo que están haciendo. Básicamente, usted no puede contar con él, pero puede suceder. Si está preocupado por la corrupción de datos debido al cierre, debe utilizar un modelo transaccional.

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