【问题标题】:Android - How to get the processName or packageName by using PID?Android - 如何使用 PID 获取进程名称或包名称?
【发布时间】:2012-01-22 11:04:30
【问题描述】:

我的问题:我可以用什么来检索某个进程的processNamepackageName,给定它的PID

因为在我的任务管理器中,我想在使用 killBackgroundProcesses 代码杀死进程的同时使用 PID。问题是我需要 packageName/processName 来做到这一点,如果我要求他们输入 processName 而不仅仅是输入它的 PID,这对用户来说会很麻烦。

这是我的任务管理器的图片:

【问题讨论】:

  • 不是你问的,但也许在你的任务管理器的最终版本中,你会让用户单击以选择要杀死的应用程序,或使用复选框。让他们输入 PID 似乎是一个额外的、不必要的步骤。
  • 是的,这是我的理想计划。但是,我还不知道如何使用复选框或单击选择方法。这就是为什么我选择首先使用这种方法。但是,如果您对如何做到这一点有一个想法,那真的会对我有很大帮助。 :D
  • 你可以试试ListView,或者对于复选框,有一个教程here

标签: android process pid


【解决方案1】:

此代码是 Yaqub 代码的简化版本。我在Util 类中将其用作静态方法:

public static String getAppNameByPID(Context context, int pid){
    ActivityManager manager 
               = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

    for(RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()){
        if(processInfo.pid == pid){
            return processInfo.processName;
        }
    }
    return "";
}

【讨论】:

  • 对不起,我不明白你的意思我们传递给这个函数的 pid 我们已经从 RunningAppProcessInfo 对象中获得,所以我们可以不用传递给这个函数并再次获取所有正在运行的应用程序的列表,而是直接从 RunningAppProcessInfo 对象调用属性,即 processInfo.processName
  • 不适用于 23 以上的 API,因为 getRunningAppProcesses() 仅返回应用程序的进程。显然没有正确的方法通过它的PID获取其他应用程序包。请参阅 Dianne Hackborn 对类似问题的回答。 groups.google.com/d/msg/android-platform/pmL5wl2w7PU/…
【解决方案2】:

您好,您可以使用此代码,它适用于 Android 2.3.3:

private String getAppName(int pID)
{
    String processName = "";
    ActivityManager am = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE);
    List l = am.getRunningAppProcesses();
    Iterator i = l.iterator();
    PackageManager pm = this.getPackageManager();
    while(i.hasNext()) 
    {
          ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo)(i.next());
          try 
          { 
              if(info.pid == pID)
              {
                  CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA));
                  //Log.d("Process", "Id: "+ info.pid +" ProcessName: "+ info.processName +"  Label: "+c.toString());
                  //processName = c.toString();
                  processName = info.processName;
              }
          }
          catch(Exception e) 
          {
                //Log.d("Process", "Error>> :"+ e.toString());
          }
   }
    return processName;
}

【讨论】:

  • 感谢您的代码。我只是想先弄清楚它,因为我对 Android 不是那么精通,而且我已经很长时间没有编写任何东西了。 :)
  • 我想问一下Log.d是做什么的?
  • 对于日志窗口 (Log.d),请参见:stackoverflow.com/questions/4584103/log-in-android-development
  • 它现在完全可以与我的其余代码一起使用。太感谢了。 :D
  • 如果应用使用非标准进程名称,这将不起作用。
【解决方案3】:

杀死其他进程通常是个坏主意..

看看这个问题Android process killerandroid task kill..

还有这个博客Android: Killing a running process with processid(pid) and package name

对于您的问题,然后如何从 pid 获取进程名称

类似的,

安装terminal emulator,启动并运行:

ps | grep 10058

ps 列出所需 ID 的进程和 grep 过滤器。

但这仅在您运行命令时应用程序正在运行时才有效。

【讨论】:

  • 是的,我已经读过好几遍了。但是,这是我们班的一个项目,所以我别无选择,只能遵守要求。感谢您的帮助。
  • 在终端中获取grep not found
  • 我的安卓控制台确实有grep,Android 4.4 CyanogenMod
猜你喜欢
  • 2011-06-16
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
相关资源
最近更新 更多