为了更好地理解活动、任务、每个任务的后台堆栈和不同的启动模式之间的关系,我想编写一个包含大约 7 个活动的应用程序,在 3 个任务中运行,其中活动以不同的启动模式启动,并且作为我正在跑步我想显示每个活动的堆栈,并在我浏览我的应用程序并启动或关闭不同的活动时观察它们的变化。
如何获取当前应用程序的所有任务列表,然后获取这些任务堆栈上的活动?ActivityManager 类让我可以根据最近或正在运行的内容查询任务信息,但如何仅为当前应用查询任务信息?
提前致谢。
为了更好地理解活动、任务、每个任务的后台堆栈和不同的启动模式之间的关系,我想编写一个包含大约 7 个活动的应用程序,在 3 个任务中运行,其中活动以不同的启动模式启动,并且作为我正在跑步我想显示每个活动的堆栈,并在我浏览我的应用程序并启动或关闭不同的活动时观察它们的变化。
如何获取当前应用程序的所有任务列表,然后获取这些任务堆栈上的活动?ActivityManager 类让我可以根据最近或正在运行的内容查询任务信息,但如何仅为当前应用查询任务信息?
提前致谢。
如何获取当前应用程序的所有任务列表
没有这样的概念。任务可以包含来自应用程序的活动。打个比方,没有网站拥有浏览器选项卡的后台堆栈,尽管网站的页面可能位于浏览器选项卡的后台堆栈中。
然后在这些任务的堆栈上获取活动?
这是不可能的,因为这些活动不一定都来自您的流程。
ActivityManager 类让我可以根据最近或正在运行的内容查询任务信息,但如何仅为当前应用查询任务信息?
你没有,严格来说。
您可以遍历正在运行的任务,并且您可以找到那些您的活动之一是baseActivity
基于topActivity
这些ComponentName
值的活动。
或者,您的活动知道他们的任务 ID,通过getTaskId()
. 如果需要,您可以在正在运行的任务中找到这些任务,匹配 ID 值,以查找有关活动任务的任务级详细信息。
从 sdk 版本 21 开始,您现在可以调用 ActivityManager.getAppTasks() 来获取属于您的应用程序的任务。
如果您有权访问 adb,则可以使用以下命令查看所有可用的任务和堆栈。
adb shell am stack list
使用以下代码,您可以获得任务编号
if (Build.VERSION.SDK_INT >= 29) {
val activityManager = getSystemService(ACTIVITY_SERVICE) as ActivityManager
val tasks = activityManager.appTasks
tasks.forEach {
logApp("it.taskInfo.numActivities:${it.taskInfo.numActivities}")
}
}