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 (); Для деталей