Android: El proceso secundario (logcat) continúa ejecutándose después de que el proceso padre (aplicación) falleció

Nuestra aplicación de Android genera un proceso de shell logcat y luego lee su resultado para su procesamiento. Sin embargo, cuando la aplicación se detiene (por ejemplo, cuando se reinicia después de la recompilación durante el desarrollo), el proceso logcat se mantendrá en ejecución. He aquí un ejemplo de este comportamiento:

processes = new ArrayList<Process>(); try { processes.add(Runtime.getRuntime().exec("logcat -v time")); processes.add(Runtime.getRuntime().exec("logcat -v time")); processes.add(Runtime.getRuntime().exec("logcat -v time")); processes.add(Runtime.getRuntime().exec("logcat -v time")); } catch (IOException e) { // oh no! } Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { for (Process p : processes) { p.destroy(); } }; }); 

Agregue esto al método onCreate () de una aplicación de prueba, inícielo y, a continuación, detenga la ejecución mediante el administrador de configuraciones. Los procesos secundarios seguirán funcionando, ahora con un padre-id de 1.

En Cómo matar el proceso logcat iniciado por la aplicación de Android? Se sugirió utilizar ProcessBuilder, pero eso no era una solución y el proceso seguirá funcionando, también.

En el proceso Stop child cuando el proceso padre se detiene , se sugirió usar un gancho de cierre – que no funciona como se demostró anteriormente.

¡Gracias!

One Solution collect form web for “Android: El proceso secundario (logcat) continúa ejecutándose después de que el proceso padre (aplicación) falleció”

Lo que usted podría hacer es spwaning otra escritura de que el único propósito es mirar su programa de Java. Siempre que muera, matar a todos sus hijos también.

Un ejemplo frágil:

 int pid = android.os.Process.myPid(); String script = "while [ -d /proc/" + pid + " ];do sleep 1;done; killall logcat"; Process p = Runtime.getRuntime().exec("/system/bin/sh", "-c", script); 

Esto supone que su proceso no se ejecuta como root, matando así sus propios procesos logcat. En su función de apagado, primero debe matar a los otros procesos ( logcat ) y luego ejecutar p.destroy(); Para detener este script asesino.

El script anterior se puede mejorar eliminando el uso de killall . En su lugar, obtenga los ID de proceso de sus procesos de logcat mediante Reflection ( esta respuesta señala a http://www.golesny.de/p/code/javagetpid ) y logcat para kill .

  • Android - ¿Cómo decidir si ejecutar un servicio en un proceso separado?
  • La vinculación al servicio que ya fue iniciada por BroadcastReceiver crea una nueva instancia de servicio
  • Android: mantener vivo un servicio de fondo (prevenir la muerte del proceso)
  • ¿Cómo matar una aplicación de terceros?
  • GetRunningAppProcesses devuelve la lista vacía en Android M (5.1.1)
  • ¿Cómo puedo ver qué wakelocks están activos?
  • ¿Cómo ejecutar una aplicación Qt en segundo plano en Android?
  • ¿Es posible iniciar una Actividad como un nuevo proceso
  • Android obtener el nombre del proceso dentro de BroadcastReceiver
  • Exploración de subred de Android
  • Android - ¿Cómo obtener el processName o packageName usando PID?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.