我正在研究如何将正在运行的任务ID绑定到其中的相应进程ID(pid)。
上下文是一个系统服务,作为需要监视前台当前活动的平台的一部分进行部署,我可以使用整个AOSP平台,但我无法更改它。
我的服务中有以下代码来获取活动堆栈:
private List<StackInfo> getStack() throws Exception
{
Log.i(TAG, "getStack");
List<StackInfo> stacks = null;
stacks = mAm.getAllStackInfos();
return stacks;
}
这是监控线程:
private class MonitorThread extends Thread
{
public void run()
{
while (true)
{
try
{
Log.i(TAG, "In MonitorThread");
Thread.sleep(1000);
StackInfo fore = getStack().get(0);
String name = fore.taskNames[fore.taskIds.length-1];
name = name.substring(0, name.indexOf("/"));
/* Next line is where I have the problem, I'm getting the task id (activity id) instead of the PID for the process */
Log.i(TAG, "Current FG PID: "+fore.taskIds[fore.taskIds.length-1] + " name: "+ name + "\n");
}
catch (Exception e)
{
Log.i(TAG, "---=== EXCEPTION!!! ===---");
Log.i(TAG, e.getMessage());
Log.i(TAG, "---=== END EXCEPTION!!! ===---");
}
}
}
}
这些目标是通过从活动堆栈中获取最高活动名称并从结果中修剪活动名称来获取当前处于前台的进程名称(例如,活动名称com.example / MainActivity属于进程com) 。实施例)。
到目前为止,我有两种实现这一目标的方法,两者都远非理想:
糟糕的方式:
我可以迭代系统中的每个应用程序并在其活动堆栈中查找当前活动,一旦找到匹配,我就可以使用应用程序PID(低效,O(M),其中M是任务总数) )
甚至最坏的方式
任务名称以com.package.xxx/activity_name的形式返回,其中&#39; /&#39;之前的部分是进程名称(据我所知,无论如何)。一旦我拥有了,我可以打电话给&#39; ps | grep com.package.xxx&#39;并解析PID的输出(我真的不想要shell调用)
我在网上找到的就是如何相反 - 所有属于应用程序的活动。
任何人都有更好的主意? 谢谢!
答案 0 :(得分:0)
您可以通过以下方式获取您的活动PID:
int id= android.os.Process.myPid();
查找其他人的PID活动check this link。使用ActivityManager
,您可以找到所有正在运行的进程,找到所需的活动,然后获取它的PID ......