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

21

我有一个应用程序,活动栈为A -> B -> C -> D -> E。现在在活动E中,我想知道我从哪些后退栈活动导航而来。我该如何找到这个信息?

8个回答

6
下面的代码可用于提取回退堆栈中所有任务及每个任务中的顶部活动。
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();
}

4
这与后退栈不同 - 后退栈可以涉及同一任务中的多个活动。我认为没有办法做到OP所要求的。 - Michael Smith
2
此外,这需要 GET_TASK 权限。 - Patrick
从LOLLIPOP(sdk 21+)开始,由于安全原因,此方法已被弃用,并且仅返回以前版本中提供的非常小的信息子集。 - Patrick
@for3st 它返回当前应用程序的信息吗? - android developer

4

我现在已经获取了堆栈中的活动列表,如何才能杀死它们呢?假设堆栈中的第三个活动。 - Anas Reza

1
getRunningTasks(..)已被弃用,或者如果您不想为应用程序添加特殊权限,则可以使用另一种解决方案,如果所有活动都是您自己的,则可以在单例StackLinkedListLinkedHashSet中标记标识符(不是活动本身,因为它可能需要进行垃圾回收):在onPause()中将标识符添加到堆栈中,在onResume()中将其删除。

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

如果您的所有活动都派生自您应用程序的共同基础活动,则可以清理代码并忘记手动执行此操作。


1
我建议你使用startActivityForResult而不是startActivity,然后为了检索来源/源活动-调用getCallingActivity().getClassName()
A如何知道它来自home? 使用getIntent()它的 getAction() -> android.intent.action.MAINgetCategories() -> android.intent.category.LAUNCHER

1

0

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


0

我不确定我理解得很好...你想回到之前的活动吗?如果是这样,请完成当前的活动,你就会回到之前的活动。


我想找出在活动E中,我是从A、B、C、D中的哪一个导航过来的,类似这样。 - azzits
好的,那么Rajdeep Dua有答案。 :P - Quentin DOMMERC

0

最明显的答案是将引用保存在某个安全的地方,例如在实用程序类中作为静态变量按特定顺序存储,例如在列表中。但这样做可能会导致内存泄漏,因此请确保手动处理并在需要时进行处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接