unsere Android App launcht einen Logcat Shell-Prozess und liest dann das Ergebnis für die Verarbeitung. Wenn die App jedoch beendet wird (z. B. wenn sie nach der Neukompilierung während der Entwicklung neu gestartet wird), wird der Logcat-Prozess weiter ausgeführt. Hier ist ein Beispiel für dieses Verhalten:Android: Kind Prozess (Logcat) läuft weiter nach Elternprozess (App) gestorben
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();
}
};
});
hinzufügen Zu den onCreate() -Methode eines Test-App, starten Sie es, dann zwang stoppen sie die Einstellung Manager. Die untergeordneten Prozesse werden weiter ausgeführt, jetzt mit einer übergeordneten ID 1.
In How to kill logcat process initiated by Android application? wurde vorgeschlagen, ProcessBuilder zu verwenden, aber das war keine Lösung und der Prozess wird auch weiterhin ausgeführt.
In Stop child process when parent process stops wurde vorgeschlagen, einen Shutdown-Hook zu verwenden - das funktioniert auch nicht wie oben gezeigt.
Danke!
Haben Sie versucht, p.waitFor() nach p.destroy() aufzurufen? Der frühere Aufruf wartet darauf, dass der Kindprozess beendet wird, und erhält den Rückkehrstatus, bevor er fortfährt, den nächsten zu zerstören. – Vikdor
@Vikdor Danke, aber nein, funktioniert nicht. Tatsächlich fügt das Hinzufügen eines Protokollierungsaufrufs im Shutdown-Hook hinzu, dass es überhaupt nicht aufgerufen wird, wenn die Anwendung (force) beendet wird. – hez
Ich denke, die Kopie von 'processes' in' new Thread() 'ist leer. Haben Sie sich von der for-Schleife oder von außerhalb der Schleife angemeldet? Können Sie Prozesse als flüchtig markieren, sodass Threads die Kopie nicht zwischenspeichern und dann prüfen? – Vikdor