如何获取runtime.getruntime().exec()
通过 android 应用程序开始使用的进程的进程 ID?
这是问题所在。我使用 UI APP 中的 runtime.getruntime().exec() 启动一个进程。如果我的 android UI 应用程序仍在运行,我可以使用 destroy 来终止进程。但是假设我使用主页或后退按钮退出应用程序,当我重新打开 ui 应用程序时,进程对象为空。那么我需要进程的PID来杀死它。
有一个更好的方法吗?
Androidjava.lang.Process
实现是java.lang.ProcessManager$ProcessImpl
并且它有 field 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。
如此完整的方法:
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 ignored) {
try {
Matcher m = Pattern.compile("pid=(\\d+)").matcher(p.toString());
pid = m.find() ? Integer.parseInt(m.group(1)) : -1;
} catch (Throwable ignored2) {
pid = -1;
}
}
return pid;
}
你会使用 PID 来终止进程吗?如果是这样,您可以简单地调用destroy()
您的Process
实例。不需要PID。请注意,您需要使用ProcessBuilder
,而不是来启动该过程getRuntime().exec()
,才能使其正常工作。
如果您确实需要进程 ID,则可能需要使用 shell 脚本。无法从 Java、AFAIK 获取 PID。
编辑:
由于您需要Process
在离开应用程序并返回应用程序后处理它,因此一种解决方案是在生成的类中创建一个静态成员Process
:
private static Process myProcess;
使用此成员存储Process
您从调用start()
您的ProcessBuilder
. 只要您的应用程序在内存中,静态成员就会一直存在——它不必是可见的。返回您的应用程序后应该可以终止该进程。如果系统碰巧杀死了您的应用程序以释放资源,那么您将无法终止子进程(如果它保持运行),但此解决方案应该适用于大多数情况。
我已经使用 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;
尝试以下操作:
int p_Id = android.os.myPid(); 详情