android runtime.getruntime()。exec()获取进程ID

时间:2012-10-24 18:51:43

标签: android process pid

如何通过Android应用程序使用runtime.getruntime().exec()获取进程的进程ID?

这是问题..我从UI APP使用runtime.getruntime()。exec()启动一个进程。如果我的Android UI应用程序仍在运行,我可以使用destroy来杀死进程.. 但是说我使用主页或后退按钮退出应用程序,当我重新打开ui应用程序时,进程对象为空。那么我需要进程的PID来杀死它。

有更好的方法吗?

4 个答案:

答案 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