2011-06-24 9 views
82

誰かが最初に呼び出されたものを教えてもらえますか?onActivityResult()ですか、それともonResume()ですか? 例:onActivityResult()&onResume()

アクティビティAは、onActivityResult()又はonResume()、アクティビティB. Bの実行を開始するstartActivityForResult()を呼び出し完了し、Aに結果を返すが、Aのどのメソッドが最初に呼ばれていますか?

誰かが既にActivity Docsを参照してこの質問に回答していることは知っていますが、自分では見つけられませんでした。

答えて

106

最初の呼び出しはonActivityResult()となり、onResume()となります。ドキュメントから

引用: 活動はあなたが にあなたを与えて、終了を立ち上げたときに呼び出されたAPIレベル1:無効onActivityResult(int型 requestCode、int型のresultCode、テント データ)

ので、保護

あなたがそれを開始したrequestCodeを とし、resultCodeを返し、 のデータを追加しました。 resultCodeは、 アクティビティが明示的にそれを返し、 が結果を返さなかった場合、または操作中に がクラッシュした場合、RESULT_CANCELEDになります。 あなたのアクティビティが に再スタートしたときに、 onResume()の直前にこの電話を に送信します。

+1

今のところ、私のコードは* onRestart *の直前にonActivityResultを呼び出しているようです: -/ –

+1

これらの図は、アクティビティとフラグメントの完全なライフサイクルを理解するのに役立ちます:https:// github。com/xxv/android-lifecycle – Sergii

10

onActivityResult()をするとき、あなたの)他の人が投稿したとして、onActivityResult()が(onResume前に呼び出され

+2

私のテストでも確認されています。 onResume()はAFTER onActivityResult()と呼ばれます。 –

34

(ほんの数ログステートメントでこれを確認し、onActivityResult()が実際onResume()前に呼び出されることを参照)が最初に呼び出されますアクティビティが再開されています。

Diane Hackbornは、UIを更新する前にUIに影響する可能性のあるものをすべて許可するためにonResume()の前にonActivityResult()が呼び出されると説明しています(おそらく、 )、返された結果を加えずにonActivityResult()を呼び出します。この

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

1つの結果は、あなたが決めたかもしれない任意の初期化は、onResume()(例えば、あなたが新鮮である必要は外部ソースからのデータの初期化)というのonCreateよりも(内のみ実行するということです)は、onActivityResult()がonActivityResult()の前に呼び出されていないため、OSによってメモリからフラッシュされたアプリケーションの再起動の一環としてonActivityResult()の呼び出しが発生したときに初期化されません。この状況で

、onActivityResult())がonActivityResult(によって使用されるこのような変数のような初期化を実行する準備ができなければなりません。

もちろん、onActivityResult()で必要な初期化がonResume()ではなくonCreate()で実行できる場合、onActivityResult()およびonResume()の前にonCreateそれはあなたがアプリが再開されるたびに行う必要のないもののために行く最も簡単な方法でしょう。しかし、初期化しているデータが外部ソースから来ていて、それを新鮮にする必要がある場合は、onCreate()とonResume()の両方でこのようなデータを初期化し、onResume() ()を呼び出して、onCreateでデータが初期化されたかどうかを確認してから、onResume()で更新してください。そうすれば、そのヴィンテージのいくつかのビンテージは常に利用可能になります(少なくとも前回のアプリの再開時)。

これに対処する別の方法は、onResume()によって取得され、そこで処理される変数(onResume()によって必要な初期化が実行された後)ではなく、onActivityResult onActivityResult()本体の中で処理を実行します。

これは非常に簡潔に文書化されており、予期しないこのシーケンスの結果に関する説明または警告は(公式ドキュメントでは)提供されていません。多くのアプリケーションを実行していないメモリがたくさんあるデバイスでは、startActivityForResult()(またはその変種)を呼び出すアクティビティがメモリからフラッシュされることはないため、テスト中にこの問題を逃すのは非常に簡単です。 onActivityResult()を使用して結果を返すアクティビティを開始しました。したがって、onResume()によって行われたすべての初期化がすでに使用可能になり、問題が検出されない可能性があります。

このシーケンスを取り巻くいくつかの問題(変数をその効果から保護するためのアプリケーションのApplicationオブジェクトの使用に関する警告を含む)には、手描きのUMLシーケンス図(

)が付いています。この

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

-1

一つの結果は、あなたが決めたかもしれない任意の初期化は、onResume()内のみ実行するということである(例えば、あなたが新鮮である必要は外部ソースからのデータの初期化)というonCreate()に比べては、希望hを含むアプリの再起動の一環としてonActivityResult()への呼び出しが発生したときに初期化されない(onResume()onActivityResult()より前に呼び出されていないため)、OSによってメモリからフラッシュされました。

この場合、onActivityResult()は、onActivityResult()によって使用されるそのような変数に対してそのような初期化を実行するように準備する必要があります。もちろん

onActivityResult()で必要な初期化はあなたのもののために行くための最も簡単な方法であろうと、onCreate()onActivityResult()onResume()の両方の前に再起動時に呼び出されます、それ以来、onCreate()ではなくonResume()で実行することができればアプリが再開されるたびに行う必要はありません。しかし、初期化しているデータが外部ソースから来ていて、それを新鮮にする必要がある場合は、onCreate()onResume()の両方のデータを初期化してonResume()のフラグをチェックして、onCreate()に設定して、 onCreate()で初期化され、その後で更新されていない場合にのみonResume()に更新されました。そうすれば、そのヴィンテージのいくつかのビンテージは常に利用可能になります(少なくとも前回のアプリの再開時)。

関連する問題