Intereting Posts
Возможность кликабельного соединения, извлекаемого в EditText, который отображает вид на клике Диспетчер аварийной сигнализации на каждую секунду в android 5.1 Уникальный идентификатор контакта Создание пользовательских кнопок со значком и текстом Какие фильтры намерения должны покрывать мои приложения, если они появляются при выборе изображения из внешнего приложения? Понимание того, как использовать класс OverScroller Столкновение с мячом: шарики падают вместе Android GoogleMap 2 обновляет информацию динамически в InfoWindow с ImageView через универсальный загрузчик изображений РейтингBar onClick Как предотвратить перезагрузку exoplayer в случае поиска назад? Is onLoadFinished () асинхронный (фоновый поток)? SwipeRefreshLayout в API 21 Java.lang.NoClassDefFoundError при запуске теста JUnit в Netbeans Выбор файла изображения из галереи с помощью FileProvider Есть ли способ явно контролировать интервалы сканирования WiFi в Android?

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

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

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

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

Solutions Collecting From Web of "Android runtime.getruntime (). Exec () получить идентификатор процесса"

Реализация java.lang.ProcessManager$ProcessImpl 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 без Reflection.

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

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

EDIT :

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