Я читал о том, как получить PID запущенного процесса в Android, который не запускается внутри Dalvik (например, фоновый нативный процесс) на пользовательском устройстве (китайский ящик), работающем на Android 2.2, и кажется, что нет родной способ сделать это в Java.
Единственный способ, которым я мог придумать, это выполнить "ps" и проанализировать вывод, но я столкнулся со странной проблемой.
Если я запускаю Runtime.getRuntime (). Exec ("ps"), в этом самом случае порт mplayer, скомпилированный ndk, через произвольный промежуток времени команда никогда не вернется.
Вот код:
Process process = null;
process = Runtime.getRuntime().exec("ps mplayer");
BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream()),8192);
char[] buffer = new char[8192];
StringBuffer output = new StringBuffer();
while ((read = reader.read(buffer)) > 0) {
output.append(buffer, 0, read);
}
reader.close();
process.getErrorStream().close();
process.getOutputStream().close();
process.waitFor();
Затем выполните некоторый анализ выходного буфера и посмотрите, существует ли в выводе mplayer.
Это прекрасно работает в течение некоторого случайного периода, скажем, от 1 часа до 3-4 часов, когда код внезапно перестает работать при попытке .exec ()
Если я запускаю его в главном потоке через запускаемый файл с .postDelayed, чтобы он мог запускаться много раз, это, очевидно, нарушает основной поток.
Если я запускаю его в отдельном потоке, я получаю то же поведение, конечно, не блокируя основной поток приложения.
Я проводил проверку каждую секунду, каждые 5 секунд, каждые 10 секунд с одинаковым результатом.
Одна странная вещь, которую я заметил, что (не уверен, если это является причиной результата проблемы), это когда exec не работает, выпуская ps в оболочке adb, я вижу 2 моих работающих приложения и один раз я убиваю самый последний, он снова начинает работать.
Кто-нибудь еще сталкивался с подобной проблемой? Я не уверен, что виноват андроид коробки, это проблема кодирования (может быть, что-то, связанное с exec, которой я не делаю) или есть другой способ, если не считать скомпилированного фонового приложения NDK и связываться с ним через IPC чтобы проверить, запущен ли этот процесс.