2011-12-24 9 views
12

Sto codificando un'applicazione Android. Ora vado a una parte in cui l'applicazione dovrebbe uccidere un processo. Ma non conosco il suo nome completo o il suo PID. So che i comandi:Ottieni il PID di un processo per eliminarlo senza conoscerne il nome completo

android.os.Process.killProcess(Pid) 

e

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

Ma il mio problema è che io non conosco il nome completo del processo.

Si tratta di un processo di codice nativo, quindi non qualcosa come com.something.something

Il processo è /data/data/com.something.something/mybinary

ma è in esecuzione con comandi come

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

a causa di questo non posso' t utilizzare

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

risposta

7

È possibile utilizzare:

È possibile ottenere tutti i nomi dei pacchetti del processo in esecuzione, controllare quale si desidera eliminare, scegliere tale processo per ottenere ID processo da service.pid.

e chiamare:

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

Ma come si inizializza l'oggetto gestore, non sono riuscito a capirlo. –

+1

ActivityManager manager = (ActivityManager) getSystemService (Context.ACTIVITY_SERVICE); questo è il modo in cui lo si inizializza. – AAnkit

+0

Non ottenere il processo da /data/data/com.something.something/mybinary –

-2

Si può fare smth come questo:

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

Quindi è possibile analizzare sb e ottenere pid del processo.

+0

yuri sto facendo questo metodo per verificare se il mio processo è in esecuzione con: se (sb.toString(). IndexOf ("dati/dati/mioprocesso")> 0) ma come posso analizzare lo sb per ottenere il pid del processo, so che il pid è dietro il nome del processo ma come posso estrarlo – user1114653

+0

Ho aggiunto il codice. – Yury

+0

mhh ho estratto il pid ne ha fatto un numero intero ma sto cercando di ucciderlo con android.os.Process.killProcess (pid); ma non ha funzionato. quando mi sto ammazzando con: android.os.Process.killProcess (android.os.Process.myPid()); funziona ma con un altro pid not: S – user1114653

1

il nome del processo è '/data/data/com.something.something/mybinary' prima ottenere ID processo del processo nativo in esecuzione analizzando l'output di top e quindi utilizzare

   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

ho ottenuto lo stesso problem.Finally, trovo un metodo per uccidere il mio processo di binario con codice Java di Android. primo luogo, scrivere informazioni sul processo in un file txt:

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

e quindi, utilizzare il codice Java per leggere questo file, si potrebbe ottenere stringa come:

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

avete il pid del processo , eseguire il comando kill in java.