una studio sesion salir que para hacer destruir con como codigo cierre cerrar camara boton atras aplicaciones aplicacion android android-activity activity-lifecycle android-windowmanager

studio - como hacer que una aplicacion no se cierre android



¿Por qué la aplicación a veces se reinicia en killProcess? (4)

Ordinariamente, saliendo de mi aplicación llamando:

android.os.Process.killProcess(android.os.Process.myPid());

funciona bien sin incidentes.

Pero de vez en cuando, la aplicación se reiniciará nuevamente (¡después de salir!).

El fragmento de registro relevante muestra:

.631: I/Process(15495): Sending signal. PID: 15495 SIG: 9 .641: W/AudioFlinger(121): write blocked for 252 msecs, 1279 delayed writes, thread 0xdc18 .651: I/ActivityManager(164): Process com.ef.myapp (pid 15495) has died. .651: I/WindowManager(164): WIN DEATH: Window{463659e8 com.ef.myapp/com.ef.myapp.MainActivity paused=false} .661: I/AudioService(164): AudioFocus abandonAudioFocus() from android.media.AudioManager@460b2b98 .701: I/ActivityManager(164): Start proc com.ef.myapp for activity com.ef.myapp/.MainActivity: pid=15589 uid=10077 gids={3003}

Sé que, por el diseño del sistema operativo Android, killProcess () no es la forma correcta de finalizar una aplicación. Esto se debe a que killProcess () detiene el proceso de inmediato sin dar ninguna forma o oportunidad para que la aplicación lo evite o se prepare para él.

Sé que cuando llamo a finish () , la pila de la aplicación simplemente se empuja al fondo (y todavía existe en la memoria). Android mismo decide cuándo cerrar la aplicación (es decir, eliminar su instancia de la memoria) y generalmente esto se hace cuando la aplicación se convierte en "la más antigua no utilizada durante más tiempo". Su comportamiento es realmente más predecible si es realmente el último .

El problema es que finish () solo detiene y destruye la actividad para la que fue llamado. No detiene otras actividades generadas por la aplicación u otras actividades. Entonces, para facilitar la prueba y la depuración durante el desarrollo, estoy usando killProcess () como un atajo conveniente.

Pero ahora veo que esto tiene el efecto secundario de que la aplicación a veces se reinicia inmediatamente después de suicidarse, todo dentro de 30 milisegundos .

Una solución directa sería iterar a través de todas las actividades de la aplicación y finalizarlas () . Pero antes de continuar con esto, me muero por entender qué hace que una aplicación resucite en el sistema operativo Android.

¿Por qué Android haría que una aplicación muerta se reiniciara?

¿Y por qué de manera inconsistente? (es decir, a veces )


Desde ADT 17.0.0 , hay un campo estático BuildConfig.DEBUG que te ayudará en la depuración. Por ejemplo, puede tener una clase estática que contenga todas las instancias de actividades en ejecución. Entonces puedes terminarlos todos a la vez. Creo que es mejor que killProcess() ...



¿Tu aplicación se ejecuta en un solo proceso o múltiple? killProcess matará un solo proceso, no necesariamente su aplicación completa. Intente utilizar ActivityManager#killBackgroundProcesses(String packageName) lugar.

Si eso no funciona, parece que estos enlaces pueden ser útiles para explicar el comportamiento del sistema cuando se mata el proceso.

Y dicho sea de paso, el sistema Android es lo que está reiniciando su aplicación ... está bien manipular su comportamiento (es decir, evitando que las aplicaciones se reinicien al cerrar la fuerza) con fines de desarrollo, pero no debería hacerlo cuando empuje su aplicación a la producción.