アクティビティのライフサイクルが頭を悩ませています。http://developer.android.com/reference/android/app/Activity.htmlのドキュメントは、可視性の概念を説明するときに非常にあいまいであるため、いつonStop()
vs が呼び出されるのかわかりませんonPause()
。
ドキュメントの次の 2 つのステートメントを比較してください。
(ライフサイクル図の真下から取得)
onStart()
およびメソッドはonStop()
、アクティビティがユーザーに対して表示および非表示になるときに、複数回呼び出すことができます。
対
(「killable」列のある青いテーブルのさらに下)
onPause()
システムが以前のアクティビティの再開を開始しようとしているときに呼び出されます。
最初の引用から私が理解できるのは、それが「非表示」のときonStop()
にアクティビティで呼び出されるということです。「非表示」とは、別のアクティビティが再開され、アクティビティが完全にカバーされていることを指していると思います。しかし、2 番目の引用では、別のアクティビティが再開しようとしているときに呼び出されると述べています。アクティビティ A も完全に非表示になるのではないでしょうか。どちらの場合も、その活動が「隠された」ものになることを暗示しているようですよね? 私のおそらく誤った解釈によると、とは同じ状況で呼び出されます。A
A
B
A
onPause()
A
onPause()
onStop()
onStop()
ドキュメントは、非表示 (呼び出される) と部分的な可視性 (呼び出される)の間でも異なるようonPause()
です。しかし、アクティビティがまだ部分的に表示されているのはいつですか? 文字通りの意味ですか?または、画面全体をカバーする新しいアクティビティ (アクティビティが startActivityForResult を呼び出し、日付ピッカー アクティビティを開始する) を開始したときに、アクティビティが「部分的に表示されている」と見なすことはできますか? 確かに、アクティビティは onStop 呼び出されませんか? いつでも結果を受け取るはずです。
だから私は私が得ていないものを理解しようとしています。onPause の呼び出しが保証されていることを理解しています。これは、アクティビティA
がフォーカスを失ったとき (デバイスがスリープ モードに入る、スクリーンロックなど)、別のアクティビティB
がフォアグラウンドを取得するときです (アクティビティが activityB
によって開始された場合と開始されていない場合がありますA
)。しかし、どの時点onStop()
でアクティビティが呼び出されるのA
でしょうか?
アクティビティ スタックのアクティビティ A の上に積み上げられたアクティビティの数の問題ですか? 「可視性」には 2 つの異なる定義がありますか?
テキストの壁については申し訳ありませんが、私は本当にイライラしています:S
では、問題は次のとおりです。具体的には、どのような状況で活動が「隠されている」と見なされ、その活動onStop()
が呼び出されるのでしょうか?
編集:
各 onX メソッドに Toast 通知を挿入したところ、さらに奇妙な点が見つかりました。
- ホームボタンを押すと、常にonStop() が呼び出されます。しかし、アプリケーションを起動しても は呼び出されません
onRestart()
。代わりに を呼び出しますonCreate()
。これは私には奇妙に思えますが、わかりました... - メイン アクティビティの上に「USB マス ストレージ」アクティビティが開始されると、
onStop()
が呼び出されます。また、USB ストレージ アクティビティを終了してメイン アクティビティに戻るonRestart()
と、 の代わりに が呼び出されonCreate()
ます。 - デバイスがスリープ モードに入り、ウェイクアップすると、アクティビティは
onPause()
andonResume()
サイクルのみを通過します。
最後のポイントは予想通りでした (ただし、ライフサイクル図には収まりません)。しかし、1. と 2. はどうでしょうか。
onRestart()
最初のポイントでは、アクティビティを再開するときにへの呼び出しを期待していました。アクティビティの割り当てを解除してonCreate()
代わりに呼び出すのはなぜですか?
ポイント 2 を見てください: ドキュメントによると、「別のアクティビティがアクティビティの前に来るとき」をonPaused()
呼び出す必要があります。USB ストレージのアクティビティが発生したときに起こったことではありませんか? を呼び出さず、 -サイクルonPause()
を通過しました! 明らかに、ドキュメントは「別のアクティビティがアクティビティの前に来る」場合を考慮していません。それで、実際に何が起こったのですか?onStop()
OnRestart()