android runtime.getruntime().exec() получить идентификатор процесса

Как получить идентификатор процесса, который начал использовать runtime.getruntime().exec() через андроид приложение??

Вот проблема.. Я запускаю процесс, используя runtime.getruntime(). Exec() из моего приложения UI. Если мое Android-приложение UI все еще работает, я могу использовать уничтожение, чтобы убить процесс. Но, скажем, я выхожу из приложения, используя кнопку возврата домой или назад, и когда я снова открываю приложение пользовательского интерфейса, объект процесса имеет значение null. Тогда мне понадобится PID процесса, чтобы убить его.

Есть лучший способ сделать это?

4 ответа

Android java.lang.Process реализация java.lang.ProcessManager$ProcessImpl и у него есть поле private final int pid;, Это можно получить из Reflection:

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 без отражения.

Будете ли вы использовать PID, чтобы убить процесс? Если это так, вы можете просто позвонить destroy() на ваше Process пример. Нет необходимости в PID. Обратите внимание, что вам нужно будет запустить процесс, используя ProcessBuilder, скорее, чем getRuntime().exec(), чтобы это работало.

Если вам действительно нужен идентификатор процесса, вам может потребоваться использовать сценарий оболочки. Нет способа получить PID из Java, AFAIK.

РЕДАКТИРОВАТЬ:

Так как вам нужно держать ручку на 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 (); Для деталей

Другие вопросы по тегам