Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取进程的PID以杀死它,而不知道它的全名_Java_Android_Eclipse_Process_Kill - Fatal编程技术网

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

Java 获取进程的PID以杀死它,而不知道它的全名,java,android,eclipse,process,kill,Java,Android,Eclipse,Process,Kill,我正在编写一个Android应用程序。现在我要讲的是应用程序应该终止进程的部分。但我不知道它的全名和PID。我知道命令: android.os.Process.killProcess(Pid) 及 但我的问题是我不知道这个过程的全名 这是一个本机代码过程,所以不像com.something.something 这个过程是/data/data/com.something.something/mybinary 但它运行的命令如下 /data/data/com.something.something

我正在编写一个Android应用程序。现在我要讲的是应用程序应该终止进程的部分。但我不知道它的全名和PID。我知道命令:

android.os.Process.killProcess(Pid)

但我的问题是我不知道这个过程的全名

这是一个本机代码过程,所以不像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")
您可以使用:

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

您可以这样做smth:

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);
    //...
}
processp=Runtime.getRuntime().exec(“ps”);
p、 waitFor();
StringBuffer sb=新的StringBuffer();
InputStreamReader isr=新的InputStreamReader(p.getInputStream());
int-ch;
char[]buf=新字符[1024];
而((ch=isr.read(buf))!=-1)
{
sb.追加(buf,0,ch);
}
HashMap pMap=新HashMap();
字符串[]processLinesAr=sb.toString().split(“\n”);
用于(字符串行:processLinesAr)
{
字符串[]comps=line.split([\\s]+”);
如果(组件长度!=9)
返回;
pid=Integer.parseInt(comps[1]);
packageName=comps[8];
pMap.put(packageName,pid);
//...
}

然后,您可以解析sb并获取进程的pid。

您的进程名称是'/data/data/com.something.something/mybinary' 首先通过解析top的输出获取运行的本机进程的进程id,然后使用android.os.process.killProcess(Pid)


}我也遇到了同样的问题。最后,我找到了一种用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命令。

yuri正在使用此方法检查我的进程是否正在运行:if(sb.toString().indexOf(“data/data/myprocess”)>0),但是我如何解析sb以获得进程的pid,我知道pid在进程名称后面,但是我如何提取它呢?我提取了pid,使其成为一个整数,但我试图用android.os.process.killProcess(pid)杀死它;但它不起作用。当我用:android.os.Process.killProcess(android.os.Process.myPid())自杀时;它可以使用另一个pid,但不能使用:这是不安全的,因为
ps
在工具箱或busybox版本中可能有不同的输出。但是如何初始化管理器对象,我不知道。ActivityManager=(ActivityManager)getSystemService(Context.ACTIVITY_服务);这是初始化它的方式。不是从/data/data/com.something.something/mybinaryWith killProcess(pid)获取进程。根据文档,您只能终止您创建的进程。使用ActivityManager.KillBackgroundProcess(packageName)终止另一个应用程序的进程。
             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());
    } 
}
echo `ps | grep /data/data/com.something.something/mybinary` > /sdcard/pid.txt
root 17857 16409 87568 14880 ffffffff aaf0ec68 R /data/data/com.something.something/mybinary