2011-12-24 3 views
12

Я кодирую приложение для Android. Теперь я перейду к той части, где приложение должно убить процесс. Но я не знаю его полного имени или его ПИД. Я знаю команды:Получить PID процесса, чтобы убить его, не зная его полного имени

android.os.Process.killProcess(Pid) 

и

android.os.Process.getUidForName("com.android.email") 

Но моя проблема в том, что я не знаю, полное имя процесса.

Это собственный процесс кода, так что не что-то вроде com.something.something

Процесс /data/data/com.something.something/mybinary

, но он работает с командами, как

/data/data/com.something.something/mybinary -a 123 -b 456 

из-за этого я могу» т

android.os.Process.getUidForName("/data/data/com.something.something/mybinary") 

ответ

7

Вы можете использовать:

ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 
List<RunningAppProcessInfo> services = manager.getRunningAppProcesses(); 
String service1name = services[1].processName; 

Вы можете получить имена всех запущенных процессов, проверить, какой из них хотите убить, выбрать этот процесс, чтобы получить идентификатор процесса по service.pid.

И вызов:

android.os.Process.killProcess(service.pid); 
+0

Но как вы инициализируете объект-менеджер, я не мог понять. –

+1

Менеджер ActivityManager = (ActivityManager) getSystemService (Context.ACTIVITY_SERVICE); Вот как вы его инициализируете. – AAnkit

+0

Не получать процесс из /data/data/com.something.something/mybinary –

-2

Вы можете сделать что-л так:

Process p = Runtime.getRuntime().exec("ps"); 
p.waitFor(); 
StringBuffer sb = new StringBuffer(); 
InputStreamReader isr = new InputStreamReader(p.getInputStream()); 
int ch; 
char [] buf = new char[1024]; 
while((ch = isr.read(buf)) != -1) 
{ 
    sb.append(buf, 0, ch); 
} 
HashMap pMap = new HashMap<String, Integer>(); 
String [] processLinesAr = sb.toString().split("\n"); 
for(String line : processLinesAr) 
{ 
    String [] comps = line.split("[\\s]+"); 
    if(comps.length != 9) 
    return;   
    pid = Integer.parseInt(comps[1]); 
    packageName = comps[8]; 
    pMap.put(packageName, pid); 
    //... 
} 

Затем вы можете разобрать С.Б. и получить PID вашего процесса.

+0

yuri im делает этот метод, чтобы проверить, работает ли мой процесс: if (sb.toString(). IndexOf ("data/data/myprocess")> 0) но как я могу разобрать sb, чтобы получить pid процесса, я знаю, что pid находится за именем процесса, но как я могу его извлечь. – user1114653

+0

Я добавил код. – Yury

+0

mhh, я получил его, извлеченный pid сделал его целым числом, но im пытался убить его android.os.Process.killProcess (pid); но это не сработало. когда я убиваю себя: android.os.Process.killProcess (android.os.Process.myPid()); это работает, но с другим pid not: S – user1114653

1

ваше имя процесса '/data/data/com.something.something/mybinary' сначала получите идентификатор процесса собственного процесса, запускаемого путем обработки вывода сверху, а затем используйте android.os.Process.killProcess (Pid)

   import org.apache.commons.exec.*; 
      import java.io.IOException; 
     public class NativeKillerRunnable implements Runnable { 
      private static final Logger logger = LoggerFactory.getLogger(NativeKillerRunnable.class); 
      @Override 
       public void run() { 
     String commandtoexec = "top -n 1 -m 100"; 
     CommandLine cmdLine = CommandLine.parse(commandtoexec); 
     DefaultExecutor executor = new DefaultExecutor(); 
     try { 
      PumpStreamHandler psh = new PumpStreamHandler(new LogOutputStream() { 
      @Override 
      protected void processLine(String s, int i) { 
       s = s.trim(); 
     //check for name of your binary process 
       if(s.contains("mybinary")) 
       { 
        String[] strings = s.split(" "); 
        android.os.Process.killProcess(Integer.parseInt(strings[0])); 
        logger.info("killed mybinary process with pid = "+strings[0]); 
       } 
      } 
     }); 
     executor.setStreamHandler(psh); 
     executor.execute(cmdLine); 
    } catch (ExecuteException executeException) { 
     logger.error("caught exception while killing mybinary process "+executeException.getMessage()); 
    } 
} 

}

0

я же problem.Finally, я найти способ убить мой бинарный процесс с андроидом кода Java. первыми, написать процесс информацию к текстовому файлу:

echo `ps | grep /data/data/com.something.something/mybinary` > /sdcard/pid.txt 

, а затем, с помощью Java-код, чтобы прочитать этот файл, вы можете получить строку как:

root 17857 16409 87568 14880 ffffffff aaf0ec68 R /data/data/com.something.something/mybinary 

вы получили PID вашего процесса , выполнить команду kill в java.

Смежные вопросы