2011-12-24 8 views
12

Koduję aplikację dla systemu Android. Teraz przejdę do części, w której aplikacja powinna zabić proces. Ale nie znam jego pełnej nazwy ani PID. Znam komendy:Uzyskaj identyfikator PID procesu, aby go zabić, nie znając jego pełnej nazwy.

android.os.Process.killProcess(Pid) 

i

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

Ale moim problemem jest to, że nie wiem, pełną nazwę procesu.

Jest to proces natywny kod, więc nie coś com.something.something

Proces jest /data/data/com.something.something/mybinary

ale to działa z poleceniami jak

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

z tego powodu mogę” t użyj

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

Odpowiedz

7

Możesz użyć:

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

Można uzyskać wszystkie nazwy pakietów uruchomionego procesu, sprawdzić, który z nich chce się zabić, wybrać, że proces otrzyma identyfikator procesu według service.pid.

i zadzwoń:

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

Ale jak zainicjować obiekt menedżera, nie mogłem dowiedzieć się. –

+1

Menedżer ActivityManager = (ActivityManager) getSystemService (Context.ACTIVITY_SERVICE); to sposób inicjalizacji. – AAnkit

+0

Nie można uzyskać procesu z /data/data/com.something.something/mybinary –

-2

Można coś zrobić tak:

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); 
    //... 
} 

Następnie można analizować sb i uzyskać PID procesu.

+0

yuri wykonuję tę metodę, aby sprawdzić, czy mój proces jest uruchomiony z: if (sb.toString(). IndexOf ("data/data/myprocess")> 0) , ale jak mogę parsować sb, aby uzyskać pid procesu, wiem, że pid jest za nazwą procesu, ale jak mogę go wydobyć? – user1114653

+0

Dodałem kod. – Yury

+0

mhh dostałem go wyodrębniony pid zrobił go liczbą całkowitą, ale próbuję go zabić z android.os.Process.killProcess (pid); ale to nie zadziałało. kiedy się z tym zabijam: android.os.Process.killProcess (android.os.Process.myPid()); działa, ale z innym pid nie: S – user1114653

1

Twoja nazwa procesu to "/data/data/com.something.something/mybinary" Najpierw pobierz identyfikator procesu rodzimego procesu, parsując dane wyjściowe z góry, a następnie użyj 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

mam samą problem.Finally, znajdę sposób, by zabić moją binarny proces z Androidem kodu java. najpierw napisać informacje procesu do pliku txt:

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

a następnie użyć kodu Java, aby odczytać ten plik, można uzyskać String jak:

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

masz PID procesu , wykonaj polecenie kill w języku Java.

Powiązane problemy