2011-12-04 163 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,以防止它在崩溃时自动启动服务。

相关问题