3

アクティビティのライフサイクルが頭を悩ませています。http://developer.android.com/reference/android/app/Activity.htmlのドキュメントは、可視性の概念を説明するときに非常にあいまいであるため、いつonStop()vs が呼び出されるのかわかりませんonPause()

ドキュメントの次の 2 つのステートメントを比較してください。

(ライフサイクル図の真下から取得)

onStart()およびメソッドはonStop()、アクティビティがユーザーに対して表示および非表示になるときに、複数回呼び出すことができます。

(「killable」列のある青いテーブルのさらに下)

onPause()システムが以前のアクティビティの再開を開始しようとしているときに呼び出されます。

最初の引用から私が理解できるのは、それが「非表示」のときonStop()にアクティビティで呼び出されるということです。「非表示」とは、別のアクティビティが再開され、アクティビティが完全にカバーされていることを指していると思います。しかし、2 番目の引用では、別のアクティビティが再開しようとしているときに呼び出されると述べています。アクティビティ A も完全に非表示になるのではないでしょうか。どちらの場合も、その活動が「隠された」ものになることを暗示しているようですよね? 私のおそらく誤った解釈によると、とは同じ状況で呼び出されます。AABAonPause()AonPause()onStop()

onStop()ドキュメントは、非表示 (呼び出される) と部分的な可視性 (呼び出される)の間でも異なるようonPause()です。しかし、アクティビティがまだ部分的に表示されているのはいつですか? 文字通りの意味ですか?または、画面全体をカバーする新しいアクティビティ (アクティビティが startActivityForResult を呼び出し、日付ピッカー アクティビティを開始する) を開始したときに、アクティビティが「部分的に表示されている」と見なすことはできますか? 確かに、アクティビティは onStop 呼び出されませんか? いつでも結果を受け取るはずです。

だから私は私が得ていないものを理解しようとしています。onPause の呼び出しが保証されていることを理解しています。これは、アクティビティAがフォーカスを失ったとき (デバイスがスリープ モードに入る、スクリーンロックなど)、別のアクティビティBがフォアグラウンドを取得するときです (アクティビティが activityBによって開始された場合と開始されていない場合がありますA)。しかし、どの時点onStop()でアクティビティが呼び出されるのAでしょうか?

アクティビティ スタックのアクティビティ A の上に積み上げられたアクティビティの数の問題ですか? 「可視性」には 2 つの異なる定義がありますか?

テキストの壁については申し訳ありませんが、私は本当にイライラしています:S

では、問題は次のとおりです。具体的には、どのような状況で活動が「隠されている」と見なされ、その活動onStop()が呼び出されるのでしょうか?

編集:

各 onX メソッドに Toast 通知を挿入したところ、さらに奇妙な点が見つかりました。

  1. ホームボタンを押すと、常にonStop() が呼び出されます。しかし、アプリケーションを起動しても は呼び出されませんonRestart()。代わりに を呼び出しますonCreate()。これは私には奇妙に思えますが、わかりました...
  2. メイン アクティビティの上に「USB マス ストレージ」アクティビティが開始されると、onStop()が呼び出されます。また、USB ストレージ アクティビティを終了してメイン アクティビティに戻るonRestart()と、 の代わりに が呼び出されonCreate()ます。
  3. デバイスがスリープ モードに入り、ウェイクアップすると、アクティビティはonPause()andonResume()サイクルのみを通過します。

最後のポイントは予想通りでした (ただし、ライフサイクル図には収まりません)。しかし、1. と 2. はどうでしょうか。

onRestart()最初のポイントでは、アクティビティを再開するときにへの呼び出しを期待していました。アクティビティの割り当てを解除してonCreate()代わりに呼び出すのはなぜですか?

ポイント 2 を見てください: ドキュメントによると、「別のアクティビティがアクティビティの前に来るとき」をonPaused()呼び出す必要があります。USB ストレージのアクティビティが発生したときに起こったことではありませんか? を呼び出さず、 -サイクルonPause()を通過しました! 明らかに、ドキュメントは「別のアクティビティがアクティビティの前に来る」場合を考慮していません。それで、実際に何が起こったのですか?onStop()OnRestart()

4

2 に答える 2

2

わかりました、私は今これを持っていると思います。

1.

最初のポイントの鍵は、次のリンクでした。

http://code.google.com/p/android/issues/detail?id=2373

そのバグです。(ホーム ボタンが押される前に) 最後のアクティブなアクティビティを再起動するだけでなく、新しいルート アクティビティ インスタンスが作成されるという問題を完全に解決したコードがリンクにいくつかあります。

コードを onCreate メソッドの先頭、super.onCreate 呼び出しのすぐ下に配置します。

if (!isTaskRoot()) {
    final Intent intent = getIntent();
    final String intentAction = intent.getAction();
    if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) &&
            intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) {
        finish(); return;
    }
}

バグが検出された場合に残りの onCreate メソッドが実行されないように、終了後に return ステートメントを追加したことに注意してください。

2.& 3.

2 番目と 3 番目のポイントの鍵は、次の 2 つのリンクでした。

http://answers.oreilly.com/topic/2692-android-programming-understanding-the-activity-life-cycle/

全画面表示しないActivityの作り方

「可視性」は文字通り文字通りであることがわかりました。そのため、「別のアクティビティがアクティビティの前に来る」とドキュメントに記載されている場合、バンプされたアクティビティの背後にあるアクティビティはまだ部分的に表示されています。これは、Android アクティビティ マネージャーが、バンプされたアクティビティがフルスクリーン アクティビティであるかどうかを確認する必要があることを意味します。フルスクリーン アクティビティである場合はonStop()、前のアクティビティで呼び出されます。そうでない場合は、onPaused()代わりに前のアクティビティで呼び出されます。

これは、USB ストレージ マネージャーがonStop()を呼び出した理由を簡単に説明しています。

これはまた、デバイスがスリープ モードに入ると、技術的にはメイン アクティビティが背後に完全に隠されていても、Activity Manager はそれを非フルスクリーン アクティビティと見なすことを意味します。

(フルスクリーン以外のアクティビティを作成する方法については、2 番目のリンクを参照してください)

興味深いことに、プルダウン ウィンドウ (通知を含む) は呼び出されませんonPause()(また、呼び出されませんonStop())。これは、非フルスクリーン アクティビティとしては理にかなっているはずです。これは、私が独自に調査する何らかの例外に違いありません。

これはまた、onStop()-onRestart()サイクルはおそらくサイクルよりも一般的であることを意味しonPause()-onResume()ます (ただし、両方を考慮に入れる必要があります)。なぜなら、アクティビティはおそらくフルスクリーン アクティビティであることが多いからです (個人的には、ドキュメントは反対のことを示していると思いました: onPause-onResumeより一般的でしたが、それは私だけかもしれません)。

さらに、これは、メイン アクティビティが結果の新しいフルスクリーン アクティビティを開始するときに、メイン アクティビティが最初に停止され、後で結果取得アクティビティが完了したときに再開されることを意味する必要があります。

したがって、唯一の問題は、割り当てが解除された一時停止されたアクティビティ (つまり、フルスクリーン以外のアクティビティによってカバーされている) をどのように処理するのが最善かということです (ただし、このケースはまれです)。どのような課題がありますか?

しかし、それはこの質問の範囲外です。

于 2011-12-29T14:36:27.367 に答える