Java Android-如何从活动ID检索PID?

Java Android-如何从活动ID检索PID?,java,android,Java,Android,我正在寻找一种方法,将正在运行的任务id与其对应的进程id(pid)绑定起来。 上下文是作为平台的一部分部署的系统服务,需要在前台监视当前活动,我可以使用整个AOSP平台,但不能更改它 我的服务中有以下代码来获取活动堆栈: private List<StackInfo> getStack() throws Exception { Log.i(TAG, "getStack"); List<StackInfo> stacks = null;

我正在寻找一种方法,将正在运行的任务id与其对应的进程id(pid)绑定起来。
上下文是作为平台的一部分部署的系统服务,需要在前台监视当前活动,我可以使用整个AOSP平台,但不能更改它

我的服务中有以下代码来获取活动堆栈:

private List<StackInfo> getStack() throws Exception
  {
      Log.i(TAG, "getStack");
      List<StackInfo> stacks = null;
      stacks = mAm.getAllStackInfos();
      return stacks;
  }
通过从活动堆栈中获取最顶端的活动名称,并从结果中修剪活动名称(例如activity name com.example/MainActivity属于process com.example),可以实现获取当前处于前台的流程名称的目标

到目前为止,我有两种方法来实现这一点,但都远远不够理想:

  • 坏方法:
    我可以迭代系统中的每个应用程序并在其活动堆栈中查找当前活动,一旦找到匹配项,我可以使用应用程序PID(低效,O(M),其中M是任务总数)

  • 最糟糕的方法
    任务名称返回com.package.xxx/activity\u name,其中“/”前面的部分是进程名称(无论如何,据我所知)。一旦有了它,我就可以调用'ps | grep com.package.xxx'并解析PID的输出(我真的不希望shell调用)

我在网上所能找到的只是如何得到相反的结果——属于某个应用程序的所有活动

谁有更好的主意?
谢谢

您可以通过以下方式获取活动PID:

int id= android.os.Process.myPid();

找到其他活动的PID。使用
ActivityManager
您可以找到所有正在运行的进程,找到所需的活动,然后得到它的PID…

这不是OP试图避免的
O(M)
方式吗Thank上也有一个例子,但正如@HannoBinder所提到的,我正试图避免这种方法,因为它的时间复杂性很长。请看我在原始帖子中描述的“坏方法”,我看你基本上是在轮询StackInfos。当前台活动/流程/应用程序发生更改时,是否有某种事件/意图需要通知?如果有,
O(M)
可以接受,因为它只是偶尔运行一次,而实际上正在发生一些事情。
int id= android.os.Process.myPid();