2012-01-06 51 views
4

我的應用程序中的主要活動有時會調用startActivityForResult,期望得到一個結果,告訴它(主要活動)接下來要顯示的信息。查看流程生命週期的文檔,看起來雖然選擇活動處於活動狀態,但主要活動被視爲「背景」活動,可能會被殺死。Android流程生命週期詳細信息

那麼選擇活動完成後會發生什麼?我看到我的活動將被重新創建,並且使用SaveInstance Bundle調用onCreate,但那又如何?然後調用onActivityResult就好像我的主要活動從未退出並重新創建?

此外,有沒有什麼辦法在測試環境中強制這種行爲,因爲它應該是非常罕見的事件?

+1

有趣的問題 – 2012-01-06 13:31:19

回答

1

提示:日誌報表

在文檔中描述的暫停狀態是:

如果活動已經失去了焦點,但仍然可見(即,新的 非全尺寸或透明活動的焦點集中在您的 活動之上),它已暫停。暫停的活動是完全活動的(它保留所有狀態和成員信息並保持連接到 窗口管理器),但可由系統在極端低內存 情況下終止。

這意味着,在正常情況下,您的主要活動應該只是控制評選活動完成時轉讓給onActivityResult()

但是,文檔還指出:

後臺活動(一個活動,是不可見的用戶和 已暫停)不再是關鍵,因此係統可以安全地殺死 其進程爲其他前景或可見的進程回收內存。如果其進程需要被殺害,當用戶導航 回活動(使其顯示在屏幕上再次),其 onCreate(Bundle)方法將它 此前曾onSaveInstanceState(Bundle)供應使其能 重啓savedInstanceState被稱爲本身與用戶最後離開它的狀態相同。

在這種情況下,主要活動可以重新繪製。

一個需要注意的重要一點是,文檔從來沒有提到onActivityResult()作爲其生命週期的方法之一here

因此,它也可能是其中的android系統將一個子活動,父活動(的情況下讀以同樣的方式startActivityforResult()onActivityResult()因爲它把一個活動 - 對話框,如下所述:

一個引人注目的活動(即對用戶可見,但不是在活動210前景,例如坐在前景對話框後面的那個)是 被認爲是非常重要的,並且不會被殺害,除非爲了保持前景活動運行而需要的是 。

+0

這也是我閱讀它的方式。事實證明,我試圖解決的問題是在我的onActivityResult方法中做了一些事情,在調用onResume之前我不應該這樣做。它現在已經修復,並且感謝您提供清晰簡潔的答案! – gordonwd 2012-01-07 13:10:45

0

答案基本上是「是」:活動被重新創建,控制流經onCreate(),onActivityResult(),onStart()等等。 如果用戶旋轉設備,活動也被破壞,例如,從縱向到橫向,除非應用程序沒有明確地阻止這種行爲。所以只需旋轉設備(仿真器上的CTRL-F11)即可進行測試。

0

假設有兩個活動A和B活動A通過startOnActivityResult調用活動B(意向,200)那麼你的活動被切換到後臺,而活動B被稱爲(的onCreate,在onStart,的onResume)依賴關於你被覆蓋的東西。

每當您的B活動調用完成()時,您的活動B就會被銷燬,而活動A將進入前臺。在這種情況下,即活動A的調用將onActivityResult - > onStart - > onResume,但您的onCreate不會被調用,因爲它只在調用某個Activity時調用。

假設您沒有從活動B調用finish()並通過intent調用Activity A,那麼只會調用onCreate()。

而且onActivityResult()當您希望保留紡紗的值或者你想notifydatasetchanged()的第三個活動的事件後,您的第一項活動中的ListView是非常有用的。你只需要在onActivityResult的活動檢查您發送resultCode並執行你的行動

+0

您確定嗎?你有參考嗎? 「每當你的B活動調用完成()時,你的活動B被銷燬,活動A到達前臺。在這種情況下,即活動A的調用將onActivityResult - > onStart - > onResume,但你的onCreate不會被調用,因爲它是隻有在您致電特定活動時纔會被調用。「 – 2012-08-21 09:40:10