如何通过Android应用程序使用runtime.getruntime().exec()
获取进程的进程ID?
这是问题..我从UI APP使用runtime.getruntime()。exec()启动一个进程。如果我的Android UI应用程序仍在运行,我可以使用destroy来杀死进程.. 但是说我使用主页或后退按钮退出应用程序,当我重新打开ui应用程序时,进程对象为空。那么我需要进程的PID来杀死它。
有更好的方法吗?
答案 0 :(得分:7)
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。
答案 1 :(得分:2)
您是否会使用PID来终止进程?如果是这样,您只需在destroy()
个实例上拨打Process
即可。不需要PID。请注意,您需要使用ProcessBuilder
而不是getRuntime().exec()
启动此过程才能实现此目的。
如果您确实需要进程ID,则可能需要使用shell脚本。没有办法从Java,AFAIK获得PID。
修改强>:
由于您需要在离开应用程序并返回到Process
之后保留句柄,因此一种解决方案是在类中生成一个静态成员,生成Process
:
private static Process myProcess;
使用此会员存储您在Process
上致电start()
时收到的ProcessBuilder
。只要您的应用程序在内存中,静态成员就会保持不变 - 它不必是可见的。应该可以在返回到您的应用后终止该进程。如果系统碰巧杀死你的应用程序以释放资源,那么你将无法终止子进程(如果它继续运行),但是这个解决方案应该适用于大多数情况。
答案 2 :(得分: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;
答案 3 :(得分:-3)
尝试以下方法:
int p_Id = android.os.myPid(); For details