2012-10-24 3 views
6

Come si ottiene l'ID di processo di un processo avviato utilizzando runtime.getruntime().exec() tramite un'applicazione Android ??android runtime.getruntime(). Exec() get id processo

Ecco il problema .. Avvio un processo utilizzando runtime.getruntime(). Exec() dalla mia APP UI. Se la mia app UI Android è ancora in esecuzione, posso usare destroy per terminare il processo .. Ma dire che esco dall'app usando il tasto home o back e quando riapro l'app ui, l'oggetto processo è nullo. Quindi avrei bisogno del PID del processo per ucciderlo.

c'è un modo migliore per farlo?

risposta

-3

provare quanto segue:
int p_Id = android.os.myPid(); For details

+2

myPid() restituisce il PID della tua app e non il processo che hai iniziato usando getRuntime(). Exec(). –

2

Utilizzerai il PID per terminare il processo? In tal caso, puoi semplicemente chiamare destroy() sull'istanza Process. Non è necessario il PID. Si noti che è necessario avviare la procedura utilizzando ProcessBuilder anziché getRuntime().exec(), affinché funzioni.

Se è davvero necessario l'ID di processo, potrebbe essere necessario utilizzare uno script di shell. Non c'è modo di ottenere il PID da Java, AFAIK.

EDIT:

Dal momento che è necessario mantenere una maniglia sul Process dopo aver lasciato la vostra applicazione e il ritorno ad esso, una soluzione è quella di rendere un membro statico della classe che genera la Process:

private static Process myProcess; 

Utilizzare questo membro per archiviare lo Process di ritorno dalla chiamata start() sul numero ProcessBuilder. Il membro statico rimarrà in giro finché la tua app è in memoria - non deve essere visibile. Dovrebbe essere possibile interrompere il processo dopo il ritorno alla tua app. Se accade che il sistema uccida la tua app per liberare risorse, allora non avrai modo di terminare il processo secondario (se rimane in esecuzione), ma questa soluzione dovrebbe funzionare nella maggior parte dei casi.

+0

ha spiegato il problema sopra –

+0

Grazie per l'aiuto .. statico funziona per ora ... ma se la mia app viene uccisa, sono spacciata :) –

0

Ho fatto qualcosa di simile usando ActivityManager, anche se ci sono avvertimenti contro di esso nella documentazione online ... Sono anche in esecuzione come app di sistema, anche se non sono sicuro che sia importante.

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 implementazione è java.lang.ProcessManager$ProcessImpl e ha campo private final int pid;. Può essere ottenere da Riflessione:

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

Un altro modo - uso toString:

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

È possibile analizzare l'output e ottenere pid senza riflessione.