2011-12-24 14 views
12

Estoy codificando una aplicación de Android. Ahora voy a una parte donde la aplicación debería matar un proceso. Pero no sé su nombre completo o su PID. Sé que los comandos:Obtiene el PID de un proceso para matarlo, sin saber su nombre completo

android.os.Process.killProcess(Pid) 

y

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

Pero mi problema es que no sé el nombre completo del proceso.

Es un proceso en código nativo, por lo que no es algo como com.something.something

El proceso es /data/data/com.something.something/mybinary

pero que se está ejecutando con comandos como

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

debido a esto no puedo t use

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

Respuesta

7

Puede usar:

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

Puede obtener todos los nombres de paquete del proceso en ejecución, verificar cuál desea eliminar, elegir ese proceso obtener id del proceso por service.pid.

Y llamada:

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

Pero, ¿cómo se inicializa el objeto administrador, no pude entenderlo. –

+1

ActivityManager manager = (ActivityManager) getSystemService (Context.ACTIVITY_SERVICE); esta es la forma en que lo inicializas. – AAnkit

+0

No se obtiene el proceso desde /data/data/com.something.something/mybinary –

-2

Usted puede hacer algo bajo la siguiente manera:

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

A continuación, se puede analizar el SB y obtener el pid del proceso.

+0

yuri estoy haciendo este método para comprobar si mi proceso se está ejecutando con: if (sb.toString(). IndexOf ("data/data/myprocess")> 0) pero ¿cómo puedo analizar el sb para obtener el pid del proceso, sé que el pid está detrás del nombre del proceso, pero ¿cómo puedo extraerlo? – user1114653

+0

Agregué el código. – Yury

+0

mhh lo tengo extraído, el pid lo convirtió en un número entero, pero estoy tratando de matarlo con android.os.Process.killProcess (pid); pero no funcionó. cuando me estoy matando con: android.os.Process.killProcess (android.os.Process.myPid()); funciona pero con otro pid no: S – user1114653

1

el nombre del proceso es '/data/data/com.something.something/mybinary' primero obtenga la identificación del proceso nativo procesando analizando la salida de la parte superior y luego use 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

llegué misma problem.Finally, me parece un método para matar mi proceso binario con el código de java androide. primero, escribir información del proceso a un archivo txt:

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

y luego, utilizar el código de Java para leer este archivo, se puede obtener de cuerda como:

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

usted tiene el PID de su proceso , ejecuta kill command en java.

Cuestiones relacionadas