2011-12-04 196 views
1

我在閱讀有關如何獲取正在運行的進程在android中運行的進程的PID,該運行進程不在dalvik內運行(例如,後臺本機進程)在自定義設備(中文框)上運行android 2.2,似乎沒有原生的方式來做到這一點在Java中。Android Runtime.getRuntime()。exec

我能想到的唯一方法就是執行「ps」並解析輸出,但是我遇到了一個奇怪的問題。

如果我在這種情況下運行Runtime.getRuntime()。exec(「ps」)一個ndk編譯的mplayer端口,隨機一段時間後,該命令永遠不會返回。

下面的代碼:

Process process = null; 
process = Runtime.getRuntime().exec("ps mplayer"); 
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()),8192); 

char[] buffer = new char[8192]; 
StringBuffer output = new StringBuffer(); 
while ((read = reader.read(buffer)) > 0) { 
     output.append(buffer, 0, read); 
} 
reader.close(); 
process.getErrorStream().close(); 
process.getOutputStream().close(); 
process.waitFor(); 

然後做輸出緩衝區的一些分析,看看是否在輸出中存在的mplayer。

這一段時間,隨機時期的偉大工程,說是1小時至3-4小時,當代碼突然停止嘗試.exec()

工作時,如果我通過主線程中運行它一個可運行的.postDelayed因此它可以運行多次,它顯然打破了主線程。

如果我在單獨的線程上運行它,我會得到相同的行爲,當然不會阻塞主應用程序線程。

我一直在每隔5秒鐘每隔10秒鐘運行一次檢查,結果相同。

我注意到一件奇怪的事情(不知道它的問題結果的原因)是當exec不工作時,通過在adb shell中發出一個ps,我可以看到2個正在運行的應用程序,以及一旦我殺了最近的一次,它就會重新開始工作。

是否有其他人遇到過類似的問題?我不確定是不是這個盒子的android有問題,這是一個編碼問題(也許與exec相關的事情我沒有做),或者如果有另一種方法,缺少一個NDK編譯後臺應用程序並通過IPC與它通信檢查該進程是否正在運行。

回答

0

如果您使用服務每5秒檢查一次,則必須從覆蓋方法onStartCommand()返回START_NOT_STICKY,以防止它在崩潰時自動啓動服務。

相關問題