2011-11-16 50 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