(ほんの数ログステートメントでこれを確認し、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
今のところ、私のコードは* onRestart *の直前にonActivityResultを呼び出しているようです: -/ –
これらの図は、アクティビティとフラグメントの完全なライフサイクルを理解するのに役立ちます:https:// github。com/xxv/android-lifecycle – Sergii