获取进程的PID以杀死它,而不知道它的全名

时间:2011-12-24 14:58:23

标签: java android eclipse process kill

我正在编写一个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")

4 个答案:

答案 0 :(得分:7)

您可以使用:

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

您可以获取所有正在运行的进程的程序包名称,检查要终止的程序包,通过service.pid选择该进程获取进程ID。

并致电:

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

答案 1 :(得分:1)

您的流程名称为'/data/data/com.something.something/mybinary' 首先通过解析top的输出来获取本机进程的进程id,然后使用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());
    } 
}

}

答案 2 :(得分:0)

我遇到了同样的问题。最后,我找到了一个用android java代码杀死我的二进制进程的方法。 首先,将进程信息写入txt文件:

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,在java中执行kill命令。

答案 3 :(得分:-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。