Android Runtime.getRuntime()。exec

时间:2011-12-04 16:27:01

标签: android process exec execution

我正在四处阅读如何获取android中运行进程的PID,这不是在运行android 2.2的自定义设备(中文框)上运行dalvik(例如,后台原生进程),似乎没有本机方式在java中执行此操作。

我能想到的唯一方法是执行“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的runable在主线程中运行它,那么它可以运行很多次,它显然会破坏主线程。

如果我在一个单独的线程上运行它,我会得到相同的行为,当然不会阻止主应用程序线程。

我每隔一秒,每5秒,每10秒运行一次检查,结果相同。

我注意到一件奇怪的事情(不确定它是否是问题结果的原因)是当exec不工作时,通过在adb shell中发出ps,我可以看到我运行的2个应用程序,并且一次我杀了最近的,它又开始工作了。

还有其他人遇到过类似的问题吗?我不确定这是盒子的机器人是否有问题,这是一个编码问题(也许与exec相关的事情我没做)或者是否有另一种方式,缺少NDK编译的后台应用程序并通过IPC与之通信检查该进程是否正在运行。

0 个答案:

没有答案