2011-11-16 44 views
0

我有一个活动,可以从我的父活动和其他应用程序通过意向过滤器(即ACTION_VIEW)调用。在哪里将Android完成()返回到

当我在我的activity中调用finish()时,如何返回正确的调用者?

即: 其他应用程序 - >我的活动 - >完成() - >其他应用

目前如果我的主要活动仍在运行,结束()将返回我的主要活动,尽管它被称为从其他应用程序。

+0

好吧,这很奇怪。如果我的活动由Gmail应用程序调用,那么当我的活动完成时它将返回到Gmail应用程序。但如果它是由Dropbox应用程序调用的,当我的活动结束时它将返回到我的主要活动。 – oceanpriest

+0

和我的主要活动onActivityResult甚至没有被解雇。 – oceanpriest

回答

0

阅读Tasks - 通过从不同任务(/应用程序)调用活动,您将现有任务置于前台,这可能包括您不想要的后台堆栈中的其他活动。我会建议指定可从其他应用程序启动的活动的android:taskAffinity。由于这将确保此活动将成为Task中唯一的活动,因此它是从它自己的应用程序或其他应用程序启动的无关紧要。

编辑:图4中的任务链接显示您的情况。

+0

感谢您的链接。我的应用程序有几个用于处理文件的Intent过滤器(ACTION_VIEW,ACTION_SHARE)。在我的处理部分结束时,我只需调用finish()。对于通过VIEW操作的Gmail应用,它将正确返回。对于通过VIEW操作的其他应用程序,它不会返回到调用应用程序。对于通过SHARE操作的其他应用程序,它将正确返回。 – oceanpriest

0

当您要调用子活动时使用startactivityforresult()。你会回到好的。

1

如果您从startActivityForResult(Intent)开始一项活动,那么您可以从getCallingActivity()开始第一项活动。

+0

在这种情况下,如果我的主要活动正在运行。假设我的主要活动是来电者。但原来的调用者实际上是通过ACTION_VIEW意图调用我的活动的其他应用程序(即gmail,dropbox)。那么如何返回到gmail/dropbox而不是我的主要活动。 – oceanpriest

+0

因此,让我解释一下你的问题:如何从开始的活动中获得启动另一活动的活动。我不确定是否有可能,至少你不能从意图中提取这些信息。 –

1

如果您对活动调用完成方法,则会返回到历史堆栈中最顶端的活动。默认情况下,它是您访问的以前的活动。

例如:

首页> A> B

如果漆面呼吁活动B,您将返回到活动A. 如果漆面呼吁活动A,但活动B仍然活着,因为它是历史堆栈中最顶层的活动,所以您将继续留在活动B中。 如果在活动B上调用完成,但出于某种原因活动A不在您的历史堆栈中(最有可能的是,如果您指定活动A不能保存在历史堆栈中),您将返回到活动主体而不是活动B.

+0

能否详细说明历史堆栈?如何调试堆栈的内容?是我的应用程序或全局本地堆栈? – oceanpriest

+0

历史堆栈包含您以前访问过的所有活动。当您开始一项新活动时,它将被推入历史堆栈。同样,完成后它会从历史堆栈中弹出。我认为,在Android API 11上,Android已经有了用于操作堆栈的内置支持。我不确定堆栈是否是本地的应用程序或不是因为我还没有尝试从一个应用程序调用另一个应用程序的活动。 – Arci