0

アクティビティ ライフ サイクルのコールバックと状態の保存について読み始めましたが、理解できないことがかなりあります。Android アプリを作成していますが、少数のユーザー向けに具​​体的に行う方法よりも一般的な質問をしたいです。現時点での活動など、これがどのように機能するかをよりよく全体的に把握したいと思います!

私が使用されている方法には 2 つのグループがあります (他に 1 つまたは 2 つ見たことがありますが、これ以上混乱させたくありません...)。

  • onPause、onResumeなど、
  • そしてonSaveInstanceStateのもの。

それらと、それらを使用しようとする状況との違いは何ですか? 投稿者が通常のライフ サイクル コールバックの 1 つを使用しており、代わりに onSaveInstanceState を使用するように指示されているという質問をいくつか見てきました。一時的な状態にのみ使用されるメソッドについて言及されているいくつかの投稿がありますが、誰かがそれを拡張できますか?

UI/ビューの状態とアクティビティの状態のように、状態が少し異なる意味で使用されているのを見てきましたが、この 2 つの違いは何ですか?
また、状態が何を意味するのかについても少しわかりません。状態を保存するときに、正確に保存しているものの種類を教えてください。簡単な例を教えてください(実際のコードではありません)。Android デベロッパー ガイドによると、Android システムが自動的にこの問題の一部を処理します。onCreate と onSaveInstanceState で使用されるバンドル オブジェクトは単純な値のみを格納するため、より複雑なオブジェクトと配列はどうでしょう。

ありがとう

4

3 に答える 3

0
protected void onPause ()
protected void onSaveInstanceState (Bundle outState)

それを見るだけで、onSaveInstanceState には、保存する必要のあるものを入れることができるバンドルがあります。そして、onCreate(Bundle)またはonRestoreInstanceState(Bundle);に戻します。ドキュメントのいくつかの重要な行:

このメソッドは、アクティビティが強制終了される前に呼び出されるため、将来戻ってきたときに状態を復元できます。このメソッドを、アクティビティがバックグラウンドに配置されているときや破棄の途中で常に呼び出されるonPause()や、破棄の前に呼び出されるonStop()などのアクティビティライフサイクルコールバックと混同しないでください 。

于 2013-02-27T17:02:26.500 に答える
0

Androidは、いつでもアクティビティを破壊したり、プロセスを強制終了したりする可能性があります(ただし、ユーザーに表示されている場合はそうではありません:-))。ユーザーがアクティビティに戻ると、画面を離れる前に画面に表示されていたデータ/情報が再び表示されます。

コールバックを使用すると、これonSaveInstanceStateを行うことができます。

ほとんどのビューはすでにこれを自動的に実行します。たとえば、EditTextの現在のテキスト、ListViewの現在のスクロール位置などは、すべて自動的に保存されます。

ただし、自動的に保存されないものがいくつかあります。たとえば、TextViewの現在のテキスト、特定のビューの(変更された)背景描画可能。

たとえば、ユーザーアクションが失敗した後にエラーメッセージを表示するとします。エラーメッセージがに表示され、TextFieldこのTextField背景が赤になります(私はこれをここで作成しています:-))。このエラーが表示されているときにユーザーがアクティビティを離れると(たとえば、ホームボタンを押す)、アクティビティは破棄され、ユーザーがアクティビティに戻ったときにエラーメッセージと赤い背景が再び表示されることはありません。

これがonSaveInstanceState救いの手を差し伸べるところです。エラーメッセージを含むをそこに
保存できます。String次に、アクティビティが再作成されると、Bundle savedInstanceStateonCreateはnullではなく、エラーメッセージをクエリできます。このメッセージがnull/空でない場合は、エラーメッセージを呼び出しsetTextて、その背景を赤にします。TextViewTextView

于 2013-02-27T17:28:32.983 に答える
0

このコードを使用して状態を保存してみてください

@Override
protected void onSaveInstanceState(Bundle outState) {
  State s = new State(yourTextView.getText().toString());
  outState.putSerializable(State.STATE, s);
  super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  State s = (State) savedInstanceState.getSerializable(State.STATE);
  yourTextView.setText(s.getYourTextViewText());
}
于 2013-02-27T17:15:11.310 に答える