2012-10-02 16 views
34

私はonRestoreInstanceStateonSaveInstanceStateに関する2つの質問があります。onCreateとonRestoreInstanceStateは互いに排他的ですか?

1)これらのメソッドは、アクティビティのライフサイクルにどこに適合しますか?私は多くの文書を読んだことがありますが、活動の状態を保存するときには、活動の状態を保存するという広範な声明を除いて、明確なアイデアはありません。onCreateonRestoreInstanceStateは互いに排他的ですか?

3)は、アクティビティが破壊されたときに呼び出されるonRestoreInstanceStateですか?これは何を意味するのでしょうか?他のアクティビティが現在の上に浮かんでいるシナリオを除いて、アクティビティは常に破棄されます。

4)onRestoreInstanceStateは、ジェリービーンの計器からのみ呼び出されるようです。これはもはやアクティビティライフサイクルに関連していませんか?あなたの活動が殺されている場合

+1

追加情報:初めてアクティビティを作成したときに 'onRestoreInstanceState'は呼び出されませんでした。 –

答えて

3
  1. は、たとえば、あなたは別のアクティビティを開始し、システムが、あなたはそれを復元状態を保存するためにonSaveInstanceStateを使用することができ、それはあなたの活動を殺すために必要なリソースが不足しています。

  2. 必ずしもそうではありません。 onCreateはonStartの前に呼び出されますが、onRestoreInstanceStateはafterと呼ばれるため、達成しようとしている内容によって異なります。

  3. あなたはonSaveInstanceStateを意味します。 1

  4. 上で申し訳ありませんが...私は知らないが、私はどこを行う)Jellybean

+0

はいつでもonCreateを呼び出すでしょうか? 私のためにonRestoreInstanceStateはすべての方法で冗長であるように見えます – user210504

+0

あなたのアプリが停止またはコールドスタートするとonCreateが呼び出されます。それらは冗長ではなく、呼び出される順番が異なります。これは実行しようとしていること(つまり、アプリケーションの状態を復元する)によって非常に重要です。 – albattran

+1

"onCreateはonStartの前に呼び出されますが、onRestoreInstanceStateは"〜の後に呼び出されます。ところで、私はonCreateとonResumeの組み合わせが有用であることを知っています。なぜなら、バンドルがあるかどうかにかかわらず両方とも実行されるからです。私はすべての決定をonCreateで行います。存在する場合はバンドルからの情報、別の場所に保存した永続ストレージ、または最初に実行した場合はデフォルト値を使用します。その後、onResumeはonCreateで実行できない最後のステップを実行します。 onResumeにはバンドルアクセスがないので、onCreateを使用してローカルフィールドを準備してください。 – ToolmakerSteve

6

1であることを試したことのない活動がポイントのように殺されたときだけでなく、それが呼び出されますこれらのメソッドはアクティビティライフサイクルに適合していますか?

開発者ドキュメント。

onSaveInstanceState(バンドルoutState)

それが将来的に戻っていくつかの時間が来るとき、それはその状態を復元できるように活動が殺される前に、このメソッドが呼び出されます。たとえば、アクティビティAの前でアクティビティBが起動され、アクティビティAがリソースを再利用するために殺された場合、アクティビティAはこのメソッドを介してユーザインターフェイスの現在の状態を保存して、アクティビティAには、onCreate(Bundle)またはonRestoreInstanceState(Bundle)を使用してユーザーインターフェイスの状態を復元できます。

デフォルトのonSaveInstanceState()の実装では、IDを持つすべてのビューに関連するデータを保存します。

このメソッドが呼び出されると、onStop()の前に発生します。onPause()の前後に発生するかどうかは保証されません。活性は、以前に保存した状態

3から再初期化されているONSTART())がonRestoreInstanceStateのときに呼び出された後に、このメソッドが呼び出され

onRestoreInstanceState(バンドルsavedInstanceState)活動は破壊されていますか? これはどういう意味ですか?別のアクティビティが現在のフロー上に浮動しているときには、アクティビティは常に破棄されます( )。

この方法は、ONSTART()活性は、以前に保存された状態から再初期化されている後に呼び出さonSaveInstanceStateに保存されたデータを含むバンドルオブジェクトであるsavedInstanceState ((バンドル ここで与えられる

))。

ほとんどの実装では、単にonCreate(Bundle)を使用して状態を復元しますが、すべての初期化が完了した後に行うのが便利な場合や、サブクラスが既定の実装を使用するかどうかを判断できる場合があります。このメソッドのデフォルトの実装では、以前にonSaveInstanceState(Bundle)で凍結されたビューステートの復元が実行されます。

4)onRestoreInstanceStateは、ゼリービーンの 計測器からのみ呼び出されるように見えます。これはアクティビティに関連しなくなった ライフサイクル?

いいえ、onRestoreInstanceStateはAPIレベル1以来存在しています。また、新しいJelly Bean APIの一部です。

+0

私はドキュメントからこのすべての情報にアクセスしています。私が見ていることは、場合によっては、onCreate/onRestoreInstanceが相互に排他的である場合に発生するNPEをいくつか見ていることです。だから私は、これらのメソッドがいつ呼び戻されるのかを最終的に判断できる場所に到達しようとしています。 – user210504

+0

絶対に排他的ではありません。 onCreateはアクティビティの作成中に*常に*呼び出されます。 onRestoreInstanceは、復元するインスタンスがある場合にのみ呼び出されます。(アプリケーションを終了するいくつかの方法でインスタンスを作成しないでください) – ToolmakerSteve

55

これらの方法はどこでアクティビティのライフサイクルに適合していますか?

OnSaveInstanceStateは、アクティビティが強制終了または再開される直前に呼び出されます(たとえば、メモリ圧迫または設定変更のb/c)。これは、アクティビティがフォーカスを失ったときに呼び出されるonPauseとは異なります(別のアクティビティに移行するなど)。

通常、onSaveInstanceStateはonPauseの後、しかしonStopの前に呼び出されますが、必ずしもそうとは限りません。たとえば、戻るキーを押すと、アクティビティが破棄されます(finish()の呼び出しのように)。したがって、onSaveInstanceStateが呼び出されないように状態を保存する必要はありません。では、なぜonPauseに状態を保存しないのですか?アクティビティがフォーカスを失ったからといって、それが殺されたわけではありません。それはまだ記憶に残っています。基本的には、一時停止するたびに状態を保存するのではなく、一時停止していて目に見えなくなる(つまり、前景から背景に移動する)状態を保存します。

だから、あなたはonPauseで何をすべきですか?理想的には、バッテリを消耗させるリソース(ネットワーク接続など)を解放し、ジオや加速度計をオフにしたり、ビデオを一時停止したりする必要があります(これはアプリに依存します)。また、これらのリソースをonResumeに復元します。これは、推測したように、アクティビティが重視されたときに呼び出されます。

onCreateとonRestoreInstanceStateは互いに排他的ですか?

onRestoreInstanceStateは、onCreateで簡単に状態を復元できるため、冗長です。

ほとんどの実装では、単純に自分の状態を復元するのonCreate(バンドル)を使用しますが、すべての後に、ここでそれを行うには、時々便利です:

は、ここでは、公式ドキュメントをonRestoreInstanceStateのために言っていることであると述べましたまたはサブクラスがデフォルトの実装を使用するかどうかを決定できるように、を初期化しました。

したがって、ビュー階層をonCreateにレイアウトし、以前の状態をonRestoreInstanceStateに復元してください。これを行うと、アクティビティをサブクラス化するすべての人が、onRestoreInstanceStateをオーバーライドしてリストア状態のロジックを増やすか置き換えることができます。これは、onRestoreInstanceStateがテンプレートメソッドの役割を果たすと言っています。

アクティビティが破棄されたときにonRestoreInstanceStateが呼び出されますか?これは何を意味するのでしょうか?

これは部分的に1で答えられました。はい、システムがあなたの活動を破壊しようとしているときにonRestoreが呼び出されます。メモリが足りなくなったり、ユーザーが明示的にアプリケーションを終了したり(たとえば、ナビゲーションバーのスクロール - 削除など)、設定が変更された場合(たとえば、肖像画の景色など)、システムはあなたのアクティビティを破壊します。

アンドロイドはこのように設計されているのはなぜですか(デスクトップアプリとは異なります)。モバイルシステムでは、リソース管理はバッテリ寿命の急激な問題です。だからあなたは、アプリがライフサイクルにフックを提供して、シャットダウンやフォーカスの失われた状態をクリーンに保存したり復元したりすることができます。

onRestoreInstanceStateは、ジェリービーンの計測器からのみ呼び出されるようです。これはもはやアクティビティライフサイクルに関連していませんか?

私はこの質問を理解していません。あなたはそれを言い換えることができますか?

+4

ドキュメントには、 'onSaveInstanceState(Bundle)ではなく永続データを保存することが重要であることに注意してください。なぜなら、後者はライフサイクルコールバックの一部ではないからです' – GVillani82

+1

@ Joseph82ドキュメント内のそのステートメントについて迷惑をかけるのは、バンドルオブジェクトsavedInstanceStateが渡されず、アプリケーションが他の手段(sharedPrefs、sqliteDB ) – Ryan

関連する問題