2011-06-24 32 views
82

有人可以告訴我哪個被調用,是onActivityResult()還是onResume()? 實施例:onActivityResult()&onResume()

活性A調用startActivityForResult()開始活動B.乙執行,完成和一個結果返回給A,但其中A的方法中,首先調用,onActivityResult()onResume()

我知道有人已經通過參考Activity Docs回答了這個問題,但我自己找不到。

回答

106

首先呼叫onActivityResult()然後onResume()。從文檔

報價:

保護無效onActivityResult(INT requestCode,INT resultCode爲,意圖 數據)

因爲:當 活動,您發起退出調用API等級1,給 你請求代碼,你從 開始,它返回的resultCode和 中的任何附加數據。 resultCode將會RESULT_CANCELED,如果 顯式返回的活動, 沒有返回任何結果,或在其操作過程中崩潰 。 當您的活動是 重新啓動時,您將在 onResume()之前立即收到 此呼叫。

+1

截至目前爲止,我的代碼似乎在* onRestart *之前立即調用onActivityResult *: -/ – 2013-01-15 05:28:12

+1

這些圖對於理解Activity和Fragment的完整生命週期非常有用:https:// github。com/xxv/android-lifecycle – Sergii

10

onActivityResult()首次調用(只是有幾個日誌報表證實了這一點,並看到onActivityResult()onResume()之前確實叫)

+2

我的測試也證實了。 onResume()被稱爲AFTER onActivityResult()。 –

34

正如其他已經公佈,onActivityResult()時的onResume之前稱爲()當你的活動正在重新啓動。

Diane Hackborn解釋說,在onResume()之前調用onActivityResult()是爲了允許在更新UI之前接收並使用可能會影響UI的任何內容(假定避免雙重更新 - 一次在onResume( )沒有返回結果,然後在onActivityResult()中添加返回的結果)。這

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/3epIML7fjGw

一個後果是,你可能已經決定任何初始化內的onResume()(例如,來自外部來源,你需要新鮮數據的初始化),而不是的onCreate(僅執行),當對onActivityResult()的調用作爲重新啓動由OS刷新內存的應用程序的一部分而發生時(因爲在onActivityResult()之前不會調用onResume()),將會未初始化。

在這種情況下,onActivityResult()將不得不準備對onActivityResult()使用的使用的任何變量執行初始化。當然,如果onActivityResult()所需的初始化可以在onCreate()而不是onResume()中執行,那麼因爲onCreate()將在onActivityResult()和onResume()之前重新啓動時被調用,那將是最簡單的方式去做你不需要每次重新開始應用程序時都要做的事情。但是,如果您正在初始化的數據來自外部來源,並且您需要新鮮數據,則可能需要在onCreate()和onResume()中初始化此類數據,onResume()檢查onCreate中設置的標誌()來查看數據是否剛剛在onCreate中初始化),然後僅在onResume()中更新它時,纔會將其更新。這樣,它的一些年份將始終可用(至少在應用程序恢復之前)。

解決這個問題的另一種方法是將onActivityResult()返回的信息存儲在將由onResume()獲取並在那裏處理(在onResume()執行任何所需的初始化之後)的變量中,而不是在onActivityResult()本體內執行處理。

這是一個非常簡潔的記錄功能,沒有解釋或警告(在官方文檔中)關於這種有點意外測序的後果。在測試過程中錯過這個問題也很容易,因爲在有大量內存的設備上沒有運行很多應用程序,調用startActivityForResult()(或其變體)的活動可能永遠不會從內存刷新,等待開始的活動通過onActivityResult()返回結果,因此onResume()完成的所有初始化已經可用,因此可能無法檢測到問題。

關於此次測序的一些問題(包括嘗試使用應用程序的Application對象來保護變量不受其影響)的一些問題進行了詳盡的探討,並附有手繪UML序列圖,其中包含:

http://steveliles.github.com/android_activity_lifecycle_gotcha.html

-1

一個後果是,你可能已經決定任何初始化內的onResume()只執行(例如,從外部來源數據的初始化,你需要是新鮮的),而不是在onCreate(),將在onActivityResult()的調用發生時會作爲重新啓動應用程序的一部分發生未初始化因爲操作系統已將內存刷新(因爲在onActivityResult()之前不會調用onResume())。

在這種情況下,onActivityResult()將不得不準備對onActivityResult()使用的任何此類變量執行初始化。

當然,如果onActivityResult()所需的初始化可以在onCreate()進行,而不是在onResume(),則由於onCreate()上都將進行onActivityResult()onResume()之前重新啓動被稱爲,這將是去的東西最簡單的方法,你每次應用程序恢復時都不需要執行操作。但是,如果您要初始化的數據來自外部來源,並且您需要新數據,則可能需要在onCreate()onResume()之間初始化此類數據,onResume()將檢查onCreate()中設置的標誌以查看數據是否有剛剛在onCreate()中進行了初始化,然後僅在onResume()之前將其更新。這樣,它的一些年份將始終可用(至少在應用程序恢復之前)。