2012-10-24 87 views
6

我如何獲得通過Android應用程序使用runtime.getruntime().exec()開始的進程的進程ID?android runtime.getruntime()。exec()獲取進程ID

這是問題..我從我的UI APP開始使用runtime.getruntime()。exec()的過程。如果我的android UI應用程序仍在運行,我可以使用destroy來終止進程。 但是,如果我使用home或back按鈕退出應用程序,並且當我重新打開ui應用程序時,進程對象爲null。所以我會需要進程的PID來殺死它。

有沒有更好的方法來做到這一點?

回答

-3

請嘗試以下操作:
int p_Id = android.os.myPid(); For details

+2

myPid()返回您的應用程序的PID,而不是您開始使用getRuntime()。exec()的過程。 –

2

你會使用PID來殺死進程嗎?如果是這樣,您可以在Process實例上簡單地撥打destroy()。不需要PID。請注意,您需要使用ProcessBuilder而不是getRuntime().exec()啓動此過程才能正常工作。

如果您確實需要進程ID,則可能需要使用shell腳本。沒有辦法從Java,AFAIK獲得PID。

編輯

,因爲你需要保持對Process把手離開你的應用程序並返回到它後,一個解決方案是在類的靜態成員會派生的Process

private static Process myProcess; 

使用此成員來存儲Process,您可以從上撥打start()。只要你的應用程序在內存中,靜態成員就會停留在周圍 - 它不一定是可見的。應該可以在返回到您的應用程序後終止進程。如果系統恰好殺死了您的應用程序以釋放資源,那麼您將無法終止子進程(如果它仍在運行),但此解決方案適用於大多數情況。

+0

解釋了上述問題 –

+0

感謝您的幫助..靜態作品現在...但如果我的應用程序被殺害,我註定:) –

0

我已經使用ActivityManager做了類似這樣的事情,雖然在線文檔中有警告反對它......我也是作爲一個系統應用程序運行,儘管我不確定這是否重要。

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實現java.lang.ProcessManager$ProcessImpl,它有場private final int pid;。它可以從得到的反思:

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

另一種方式 - 使用的toString:

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

您可以解析輸出和無反射得到PID。

相關問題