簡體   English   中英

Android Runtime.getRuntime()。exec

[英]Android Runtime.getRuntime().exec

我正在閱讀有關如何獲取android中正在運行的進程的PID的信息,該ID不在運行android 2.2的自定義設備(中文框)的dalvik(例如后台本機進程)內部運行,並且似乎沒有本機的方法可以用java做到這一點。

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

如果我在這種情況下運行ndk編譯的mplayer端口,則運行Runtime.getRuntime()。exec(“ ps”),則經過一段隨機時間后,該命令將永不返回。

這是代碼:

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與之通信檢查該進程是否正在運行。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM