Intereting Posts
Установленное приложение Cocos2d-x не может быть запущено на Android Почему мой вещательный приемник не получает действия в системе? Как определить отмена щелчка диалогового окна datepicker? Выбранный обратный вызов Spinner активируется дважды после вращения, если выбрана ненулевая позиция Звуковой визуализатор Cordova? (С Media вместо AnalyserNode) Динамически устанавливать полномочия ContentProvider Как запустить тесты на фрагмент действия Dagger 2 issue overriding single предоставляет аннотированный метод из модуля в библиотеке, которая использует приложение Дизайн Android-приложений: Правильное разделение между действиями, службами и потоками? Как проверить производительность приложения для Android? Android Mobile Backend Starter сбой 404 не найден … несколько раз Android: отключить выбор ListView Устанавливать вес (в процентах) программно Настройте размер значка кнопки плавающего действия (fab) Почему Eclipse не распознает метод build () из класса Notification.Builder, чтобы вернуть объект Notification?

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

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

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

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

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