[英]android runtime.getruntime().exec() get process id
如何通过 android 应用程序使用runtime.getruntime().exec()
获取进程的进程 ID?
这是问题所在.. 我从我的 UI APP 中使用 runtime.getruntime().exec() 启动一个进程。 如果我的 android UI 应用程序仍在运行,我可以使用 destroy 来终止进程.. 但是说我使用主页或后退按钮退出应用程序,当我重新打开 ui 应用程序时,进程对象为空。 那么我需要进程的PID来杀死它。
有一个更好的方法吗?
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。
如此完整的方法:
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 来终止进程吗? 如果是这样,您只需在Process
实例上调用destroy()
即可。 不需要PID。 请注意,您需要使用ProcessBuilder
而不是getRuntime().exec()
来启动进程,才能使其工作。
如果确实需要进程 ID,则可能需要使用 shell 脚本。 AFAIK 无法从 Java 获取 PID。
编辑:
由于您需要在离开应用程序并返回后保留对Process
的句柄,因此一种解决方案是在生成Process
的类中创建一个静态成员:
private static Process myProcess;
使用此成员来存储您通过在ProcessBuilder
上调用start()
返回的Process
。 只要您的应用程序在内存中,静态成员就会一直存在——它不一定是可见的。 返回您的应用程序后应该可以终止该进程。 如果系统碰巧杀死您的应用程序以释放资源,那么您将无法终止子进程(如果它保持运行),但此解决方案应该适用于大多数情况。
我已经使用 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(); 详情
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.