如何在 Android 应用程序中查找回栈活动?

Posted

技术标签:

【中文标题】如何在 Android 应用程序中查找回栈活动?【英文标题】:How to find back stack activities in an android application? 【发布时间】:2011-12-21 00:14:39 【问题描述】:

我有一个带有活动回栈 A -> B -> C -> D -> E 的应用程序。现在在活动 E 中,我想知道我从中导航的回栈活动。我怎么找到这个??

【问题讨论】:

【参考方案1】:

下面的代码可以用来提取所有的tasks以及back stack中每个task里面的top activity

ActivityManager m = (ActivityManager) ctx.getSystemService( ctx.ACTIVITY_SERVICE );
List<RunningTaskInfo> runningTaskInfoList =  m.getRunningTasks(10);
Iterator<RunningTaskInfo> itr = runningTaskInfoList.iterator();
while(itr.hasNext())
    RunningTaskInfo runningTaskInfo = (RunningTaskInfo)itr.next();
    int id = runningTaskInfo.id;
    CharSequence desc= runningTaskInfo.description;
    int numOfActivities = runningTaskInfo.numActivities;
    String topActivity = runningTaskInfo.topActivity.getShortClassName();

【讨论】:

这与后退栈不同——后退栈可以在同一个任务中涉及多个活动。我认为没有办法按照 OP 的要求去做。 这也需要 GET_TASK 权限 从 LOLLIPOP (sdk 21+) 开始,由于安全原因,此功能已被弃用,并且仅返回以前版本中提供的信息的一小部分 @for3st 是否返回当前应用的信息?【参考方案2】:

可以使用“adb shell dumpsys activity activities”命令

供参考http://www.onsandroid.com/2015/01/find-back-stack-activities-in-android.html

【讨论】:

我现在得到了堆栈中的活动列表,我怎么能杀死?假设堆栈中的第三个活动【参考方案3】:

我认为你可以通过 registerActivityLifecycleCallbacks 的这个 API 监听活动的变化来做到这一点:

https://developer.android.com/reference/android/app/Application.html#registerActivityLifecycleCallbacks(android.app.Application.ActivityLifecycleCallbacks)

https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html

这将帮助您将自己的类添加到堆栈中,并根据需要查看完整状态。

【讨论】:

【参考方案4】:

我不确定我能不能搞定...你想回到上一个活动吗?如果是这样,请完成当前活动,您将回到上一个活动。

【讨论】:

我想在活动 E 中找到,我已经从 A、B、C、D 导航到类似这样的地方 好吧,Rajdeep Dua 给出了答案。 :P【参考方案5】:

实际上,您可以使用 getRunningTasks 从 runningtaskinfo 中获取任务 id 然后,通过比较任务 id 使用 getRecentTasks 获取最近的任务信息。 现在您可以使用 startactivity 重新启动该活动,并在最近的任务信息中使用 baseintent。

【讨论】:

【参考方案6】:

由于getRunningTasks(..) 已被弃用,或者如果您不想为您的应用添加特殊权限,如果所有活动都是您的,这里是一个替代解决方案:您可以标记一个标识符(不是活动本身,它可能在需要被垃圾收集)在单例StackLinkedListLinkedHashSet:在onPause() 中将标识符添加到堆栈并在onResume() 中删除它。

您可以检查该堆栈的内容以了解是否有任何活动以及它们已创建的顺序。

如果您的所有 Activity 都源自您应用的通用基础 Activity,您可以清理代码而忘记手动清理。

【讨论】:

【参考方案7】:

我建议您使用startActivityForResult 而不是startActivity,然后为了检索origin/source 活动-调用getCallingActivity().getClassName()

A 怎么知道它来自家里? 使用getIntent()

getAction() -&gt; android.intent.action.MAIN

getCategories() -&gt; android.intent.category.LAUNCHER

【讨论】:

以上是关于如何在 Android 应用程序中查找回栈活动?的主要内容,如果未能解决你的问题,请参考以下文章

图片模式下 Android O 图片的任务列表和回栈

如何控制Android回栈

清除活动回栈[重复]

Android 深度链接 - 回栈

活动回栈 FLAG_ACTIVITY_NEW_TASK

使用片段清除回栈