2012-10-24 18 views
6

Jak uzyskać identyfikator procesu procesu rozpoczętego za pomocą aplikacji runtime.getruntime().exec()?android runtime.getruntime(). Exec() otrzyma identyfikator procesu

Tutaj jest problem .. Zaczynam proces przy użyciu runtime.getruntime(). Exec() z mojej aplikacji UI. Jeśli moja aplikacja na Androida jest wciąż uruchomiona, mogę użyć niszczenia, aby zabić proces. Powiedzmy jednak, że wychodzę z aplikacji za pomocą przycisku powrotu do domu lub z powrotem i kiedy ponownie otwieram aplikację, obiekt procesu jest pusty. Więc potrzebowałbym PID procesu, aby go zabić.

Czy jest lepszy sposób to zrobić?

Odpowiedz

-3

wypróbuj następujące:
int p_Id = android.os.myPid(); For details

+2

myPid() zwraca PID twojej aplikacji, a nie proces, który zacząłeś używać getRuntime(). Exec(). –

2

Czy użyjesz PID do zabicia procesu? Jeśli tak, możesz po prostu zadzwonić pod numer destroy() na swoją instancję Process. Nie ma potrzeby stosowania PID. Pamiętaj, że aby to zadziałało, musisz uruchomić proces przy użyciu ProcessBuilder, a nie getRuntime().exec().

Jeśli naprawdę potrzebujesz identyfikatora procesu, może być konieczne użycie skryptu powłoki. Nie ma sposobu, aby uzyskać PID z Java, AFAIK.

EDIT:

Ponieważ trzeba zachować uchwyt na Process po opuszczeniu aplikacji i powrót do niego, jednym z rozwiązań jest, aby statyczny element w klasie, które spawns z Process:

private static Process myProcess; 

Użyj tego elementu, aby zapisać Process, który otrzymasz z powrotem pod numerem start() na swoim . Statyczny członek pozostanie w pobliżu, dopóki twoja aplikacja będzie w pamięci - nie musi być widoczna. Powinno być możliwe zabicie procesu po powrocie do aplikacji. Jeśli zdarzy się, że system zabije twoją aplikację, aby zwolnić zasoby, nie będziesz miał możliwości zakończenia procesu potomnego (jeśli pozostanie uruchomiony), ale to rozwiązanie powinno działać w większości przypadków.

+0

wyjaśniłem problem powyżej –

+0

Dzięki za pomoc ... na razie statyczne prace ... ale jeśli moja aplikacja zostanie zabita, jestem skazana na zagładę :) –

0

Zrobiłem coś takiego przy użyciu ActivityManager, chociaż istnieją ostrzeżenia przed nim w dokumentacji online ... Używam również aplikacji systemowej, chociaż nie jestem pewien, czy to ma znaczenie.

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 realizacja jest java.lang.ProcessManager$ProcessImpl i ma pole private final int pid;. To może być dostać od refleksji:

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; 
} 

Innym sposobem - Zastosowanie toString:

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

można analizować wydajność i uzyskać PID bez refleksji.

Powiązane problemy