onCreate(バンドルのsavedInstanceState)とは


122

誰の助けを借り、私は知っているすることができますBundle savedInstanceStateonCreate(Bundle savedInstanceState)私はAndroidの中で初心者をしています。私はdeveloper.android.comからそれを理解しようとします。しかし、私には理解できません。誰でも簡単にできますか?


2
これは良い動画です:youtube.com/watch
Francisco Corrales Morales

回答:


106

アプリケーションの状態をバンドルに保存すると(通常はの非永続的で動的なデータonSaveInstanceState)、onCreateアクティビティを再作成する必要がある場合(向きの変更など)に戻すことができるため、以前の状態を失うことがありません。情報。データが提供されなかった場合、savedInstanceStatenullです。

... onPause()メソッドを使用して、永続的なデータ(ユーザーの編集など)をストレージに書き込む必要があります。さらに、onSaveInstanceState(Bundle)メソッドは、アクティビティをこのようなバックグラウンド状態にする前に呼び出されるため、アクティビティ内の動的インスタンス状態を特定のバンドルに保存して、後でアクティビティがonCreate(Bundle)で受信されるようにすることができます。再作成する必要があります。プロセスのライフサイクルが、ホストしているアクティビティにどのように関連付けられているかについての詳細は、「プロセスライフサイクル」セクションを参照してください。永続データはonSaveInstanceState(Bundle)ではなくonPause()に保存することが重要です。後者はライフサイクルコールバックの一部ではないため、ドキュメントで説明されているように、すべての状況で呼び出されるわけではありません。

ソース


2
他のアクティビティが同じバンドルを共有していますか?別のアクティビティを開始した場合、最初のアクティビティからバンドルを渡しますか?
フランシスココラレスモラレス

17

onCreate(Bundle savedInstanceState)Bundleアクティビティが最初に開始されたときにnullが取得され、アクティビティの向きが変更されたときに使用されます.......

http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html

Androidは、これを実現するもう1つのエレガントな方法を提供します。これを実現するには、というメソッドをオーバーライドする必要がありますonSaveInstanceState()。Androidプラットフォームでは、ユーザーがインスタンスの状態を保存できます。インスタンスの状態はバンドルに保存できます。バンドルは、引数としてonSaveInstanceStateメソッドに渡されます。

保存されたインスタンスの状態を、onCreateメソッドに引数として渡されたバンドルからロードできます。保存したインスタンスの状態をonRestoreInstanceStateメソッドにロードすることもできます。しかし、読者が理解するためにそれを残しておきます。


11
savedInstanceState以前に呼び出されたnull場合onSavedInstanceState()は非になります。方向の変更は、これが発生する可能性がある1つの例にすぎません。
Alex Lockwood、2012年

1
@AlexLockwood、私はこれが起こるかもしれないすべての状況を考えようとしています。ドキュメントはありますか?私が考えることができる1つの例は、ユーザーがアプリを切り替えて戻ってきたが、リソースを回復するためにアクティビティが破棄された場合です。この場合、onSaveInsanceState()がオーバーライドされた場合、Androidはバンドルでアクティビティを再作成しますよね?
batbrat 14年

1
@batbratはい...私が(ほぼ2年前に)行ったコメントは完全に正しくありません。私がそれを置く最善の方法は、それが以前に呼び出されていた場合に限り、Bundle引数onCreate(Bundle)がnon- nullifである場合に限られると思います。これは、向きを変更しているときに発生します...また、OSによって強制終了された後、アクティビティが戻ってきたとき、およびデバイスで他の構成変更をトリガーしたときにも発生します。ActivityonSaveInstanceState
Alex Lockwood 2014年

説明をありがとうアレックス。この件について明確にするのは良いことです。特に方向スイッチ以外の設定変更については忘れていました。
batbrat 2014年

15

Dhruv Gairolaが答えたように、Bundle savedInstanceStateを使用してアプリケーションの状態を保存できます。私のような新しい学習者が簡単に理解できる非常に単純な例を挙げようとしています。

TextViewとButtonを持つ単純なフラグメントがあるとします。ボタンをクリックするたびに、テキストが変化します。次に、デバイス/エミュレーターの向きを変更し、データを失い(クリックした後に変更されたデータを意味します)、フラグメントが最初から再び開始されることに注意してください。Bundle savedInstanceStateを使用することで、これを取り除くことができます。断片のライフサイクルを調べてみます。フラグメントLifecylceを使用すると、フラグメントが破棄されようとしているときにメソッド「onSaveInstanceState」が呼び出されます。

したがって、状態を保存できるということは、変更されたテキスト値を次のようにそのバンドルに保存します

 int counter  = 0;
 @Override
 public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("value",counter);
 }

オリエンテーションを行った後、「onCreate」メソッドが正しく呼び出されますか?私たちはこれを行うことができます

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(savedInstanceState == null){
        //it is the first time the fragment is being called
        counter = 0;
    }else{
        //not the first time so we will check SavedInstanceState bundle
        counter = savedInstanceState.getInt("value",0); //here zero is the default value
    }
}

今、あなたはオリエンテーションの後にあなたの価値を失うことはありません。変更された値は常に表示されます。


これはアクティビティにも当てはまることに注意してください。(アクティビティのバンドル)とフラグメントのバンドルの違いについて詳しく説明できますか?
laalaguer 2017

アクティビティが一度に複数のフラグメントを表示できるアクティビティとフラグメントのライフサイクルから明確な理解を得ることができます。したがって、基本的な違いは、アクティビティのすべてのフラグメントのいくつかの値を保存したい場合があることです。アクティビティのバンドルを使用します。それ以外の場合は、特定のフラグメントの場合はフラグメントのバンドルを使用する必要があります。
Asad

5

AndroidのonCreate(Bundle savedInstanceState)関数:

1)アクティビティが最初に呼び出されるか起動されると、onCreate(Bundle savedInstanceState)メソッドがアクティビティを作成します。

2)アクティビティの向き(水平から垂直または垂直から水平)が変更されるか、アクティビティがオペレーティングシステムによって強制終了されると、saveedInstanceState、つまりバンドルクラスのオブジェクトがアクティビティの状態を保存します。

3)向きが変更された後、onCreate(Bundle savedInstanceState)がアクティビティを呼び出して再作成し、savedInstanceStateからすべてのデータをロードします。

4)基本的にバンドルクラスは、アプリで上記の条件が発生するたびにアクティビティのデータを格納するために使用されます。

5)アプリではonCreate()は必要ありません。しかし、それがアプリで使用される理由は、そのメソッドが初期化コードを配置するのに最適な場所だからです。

6)onStart()またはonResume()に初期化コードを配置することもできます。アプリが最初にロードされると、onCreate()と同じように機能します。


4

onCreate(Bundle)アクティビティが最初に起動したときに呼び出されます。これを使用して、ユーザーインターフェイスの作成など、1回限りの初期化を実行できます。onCreate()nullまたは以前にによって保存されたいくつかの状態情報のいずれかである1つのパラメータを取りますonSaveInstanceState


0

onCreate(Bundle savedInstanceState)が呼び出され、アクティビティと上記のシナリオ(ビジュアルビュー)で終了された場合、savedInstanceStateはnull以外になります。アプリは、savedInstanceStateからデータを取得(キャッチ)して、アクティビティを再生成できます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.