繁体   English   中英

android runtime.getruntime().exec() 获取进程id

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM