2012-10-24 7 views
6

Wie bekomme ich die Prozess-ID eines Prozesses mit runtime.getruntime().exec() über eine Android-Anwendung gestartet ??android runtime.getruntime(). Exec() get Prozess-ID

Hier ist das Problem .. Ich starte einen Prozess mit runtime.getruntime(). Exec() von meiner UI APP. Wenn meine Android-UI-App noch läuft, kann ich zerstören, um den Prozess zu töten. Aber sagen, ich verlasse die App mit Home-oder Zurück-Taste, und wenn ich die Ui-App wieder öffnen, ist Prozess Objekt null. Also würde ich die PID des Prozesses brauchen, um sie zu töten.

Gibt es einen besseren Weg, dies zu tun?

Antwort

-3

versuchen Sie Folgendes:
int p_Id = android.os.myPid(); For details

+2

myPid() gibt die PID Ihrer App und nicht den Prozess zurück, den Sie mit getRuntime(). Exec() gestartet haben. –

2

Verwenden Sie die PID, um den Prozess zu beenden? Wenn ja, können Sie einfach destroy() auf Ihrer Process Instanz aufrufen. Keine Notwendigkeit für die PID. Bitte beachten Sie, dass Sie den Prozess unter Verwendung von ProcessBuilder anstelle von getRuntime().exec() starten müssen, damit dies funktioniert.

Wenn Sie wirklich die Prozess-ID benötigen, müssen Sie möglicherweise ein Shell-Skript verwenden. Es gibt keine Möglichkeit, die PID von Java, AFAIK zu bekommen.

EDIT:

Da Sie einen Griff auf dem Process nach Ihrer App zu verlassen und zurückkehren, um es zu halten brauchen, ist eine Lösung, die ein statisches Element in der Klasse zu machen, die die Process laicht:

private static Process myProcess; 

Verwenden Sie dieses Element zum Speichern der Process, die Sie von start() auf Ihrem ProcessBuilder zurückrufen. Das statische Element bleibt so lange bestehen, wie sich Ihre App im Speicher befindet - sie muss nicht sichtbar sein. Es sollte möglich sein, den Prozess nach der Rückkehr zu Ihrer App zu beenden. Wenn das System Ihre App zum Freigeben von Ressourcen beendet, haben Sie keine Möglichkeit, den untergeordneten Prozess zu beenden (wenn es weiterhin ausgeführt wird), aber diese Lösung sollte in den meisten Fällen funktionieren.

+0

erklärte das Problem oben –

+0

Danke für die Hilfe .. statische funktioniert für jetzt ... aber wenn meine App getötet wird, bin ich verloren :) –

0

Ich habe so etwas mit dem ActivityManager gemacht, obwohl es Warnungen in der Online-Dokumentation gibt ... Ich laufe auch als System-App, obwohl ich mir nicht sicher bin, ob das wichtig ist.

ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
int pid = 0; 
List<RunningAppProcessInfo> procInfo = am.getRunningAppProcesses(); 
for (RunningAppProcessInfo proc : procInfo) 
    if (proc.processName.indexOf("myApp") >= 0) 
     pid = proc.pid; 
6

Android java.lang.Process Implementierung ist java.lang.ProcessManager$ProcessImpl und es hat Feld private final int pid;. Es kann von Reflexion erhalten werden:

public static int getPid(Process p) { 
    int pid = -1; 

    try { 
     Field f = p.getClass().getDeclaredField("pid"); 
     f.setAccessible(true); 
     pid = f.getInt(p); 
     f.setAccessible(false); 
    } catch (Throwable e) { 
     pid = -1; 
    } 
    return pid; 
} 

andere Art und Weise - Verwendung toString:

public String toString() { 
     return "Process[pid=" + pid + "]"; 
    } 

Sie können die Ausgabe analysieren und ohne Reflexion pid erhalten.

Verwandte Themen