358

ドキュメントから始めます:

public void setRetainInstance (ブール値保持)

アクティビティの再作成 (構成の変更など) の間、フラグメント インスタンスを保持するかどうかを制御します。これは、バック スタックにないフラグメントでのみ使用できます。設定されている場合、アクティビティが再作成されると、フラグメントのライフサイクルがわずかに異なります。

  • onDestroy() は呼び出されません (ただし、フラグメントが現在のアクティビティから切り離されているため、onDetach() は呼び出されます)。
  • フラグメントが再作成されていないため、onCreate(Bundle) は呼び出されません。
  • onAttach(Activity) と onActivityCreated(Bundle) は引き続き呼び出されます。

いくつか質問があります:

  • フラグメントもそのビューを保持しますか、それとも構成の変更時に再作成されますか? 「保留」とは具体的にどういう意味ですか?

  • ユーザーがアクティビティを離れると、フラグメントは破棄されますか?

  • バックスタックのフラグメントで機能しないのはなぜですか?

  • この方法を使用することが理にかなっているユースケースはどれですか?

4

5 に答える 5

361

まず、保持されているフラグメントに関する私の投稿を確認してください。それは役立つかもしれません。

今あなたの質問に答えるために:

フラグメントもそのビューステートを保持しますか、それとも構成の変更時にこれが再作成されますか?正確には「保持」されるものは何ですか?

はい、Fragmentの状態は構成の変更後も保持されます。具体的には、「保持」とは、構成の変更時にフラグメントが破棄されないことを意味します。つまり、構成の変更によって基になるものが破壊された場合でも、はFragment保持されますActivity

ユーザーがアクティビティを離れると、フラグメントは破棄されますか?

sと同様に、メモリリソースが少ない場合ActivityFragmentsはシステムによって破棄される可能性があります。フラグメントが構成を変更してもインスタンスの状態を保持するかどうかは、Fragmentを離れたときにシステムがを破棄するかどうかには影響しませんActivityActivity(つまり、ホームボタンを押して)離れると、 Fragmentsは破棄される場合と破棄されない場合があります。Activity戻るボタンを押してを離れると(つまり、を呼び出しfinish()て効果的に破棄するとActivity)、Activity接続Fragmentされているすべてのが破棄されます。

バックスタックのフラグメントで機能しないのはなぜですか?

サポートされていない理由はおそらく複数ありますが、私にとって最も明白な理由は、Activityがへの参照を保持し、FragmentManagerFragmentManagerバックスタックを管理していることです。つまり、Fragmentsを保持することを選択したかどうかに関係なく、Activity(したがってFragmentManager'sバックスタック)は構成の変更時に破棄されます。それが機能しない可能性があるもう1つの理由は、保持されたフラグメント保持されていないフラグメントの両方が同じバックスタックに存在することを許可された場合、物事がトリッキーになる可能性があるためです。

この方法を使用することが理にかなっているユースケースはどれですか?

保持されたフラグメントは、アクティビティインスタンス間で状態情報(特にスレッド管理)を伝播するのに非常に役立ちます。たとえば、フラグメントは、Threadまたはのインスタンスのホストとして機能し、AsyncTaskその操作を管理できます。詳細については、このトピックに関する私のブログ投稿を参照してください。

一般的に、私はそれを...で使用するonConfigurationChangedのと同じように扱いActivityます...あなたが怠惰すぎて向きの変更を正しく実装/処理できないという理由だけでそれをバンドエイドとして使用しないでください。必要な場合にのみ使用してください。

于 2012-07-03T20:48:00.317 に答える
28

setRetaininstanceactivityの呼び出し中にインスタンスが保存されるため、構成の変更により が破棄されて再作成される場合にのみ役立ちますonRetainNonConfigurationInstance。つまり、デバイスをローテーションすると、保持されたフラグメントはそこに残りますが (破棄されたり再作成されたりすることはありません)、ランタイムがリソースを再利用するためにアクティビティを強制終了すると、何も残りません。戻るボタンを押してアクティビティを終了すると、すべてが破棄されます。

通常、私はこの関数を使用して向きを変更する時間を保存します。たとえば、サーバーから多数のビットマップをダウンロードし、それぞれが 1MB であるとします。ユーザーが誤ってデバイスを回転させた場合、すべてのダウンロード作業を再度実行したくありません。ビットマップを保持する を作成し、Fragmentそれをマネージャーに追加して呼び出しsetRetainInstanceます。画面の向きが変わっても、すべてのビットマップはそのままです。

于 2014-09-06T05:27:17.647 に答える
13

SetRetainInstance(true) により、フラグメントの並べ替えが生き残ることができます。そのメンバーは、ローテーションなどの構成変更中に保持されます。ただし、アクティビティがバックグラウンドで強制終了されると、それでも強制終了される可能性があります。バックグラウンドで含まれているアクティビティがシステムによって強制終了された場合、onSaveInstanceState を適切に処理したシステムによってその instanceState が保存される必要があります。つまり、onSaveInstanceState は常に呼び出されます。SetRetainInstance が true でフラグメント/アクティビティがまだ強制終了されていない場合、onCreateView は呼び出されませんが、強制終了されて戻されようとしている場合は呼び出されます。

Androidアクティビティ/フラグメントの分析は、それが役立つことを願っています。 http://ideaventure.blogspot.com.au/2014/01/android-activityfragment-life-cycle.html

于 2014-01-15T14:23:58.757 に答える