onRestoreInstanceStateおよびonSaveInstanceState(アクティビティの作成と復元)

onSaveInstanceState()メソッドの役割:

  • 対応するインスタンスの状態(キーと値のペアを参照)をBundleオブジェクトに保存します。これにより、アクティビティが再作成されたときに、バンドルに格納されている値を取得して以前の状態に復元できます。

onRestoreInstanceState()メソッドの役割

  • バンドルに保存されているインスタンスの状態を取得し、保存された値を通じて期待される状態にアクティビティを復元します

2つのメソッドを呼び出すタイミング:

ここに画像の説明を挿入

  • onSaveInstanceState()の呼び出しタイミングは上の図1です。
    現在のアクティビティが再開状態(完全に表示された状態)からバックグラウンドに入る、または現在のアクティビティがシステムによってリサイクルされると、システムはonStopを呼び出した後にonSaveInstanceState(を呼び出します()メソッド)他のアクティビティにジャンプしたり、ホームをクリックしたりするなどのメソッドですが、戻るキーを押すか、コードでfinish()関数を呼び出すと、アクティビティを復元できないため、onSaveInstanceState()メソッドは復元されません。対応する情報を保存するために呼び出されます。

  • onRestoreInstanceStateの呼び出しタイミングは()である2上図
    システムは、私たちの活動をリサイクルし、再びそれを復元する場合は、作成状態の後ONSTART()メソッドを呼び出し、次いでなどonRestoreInstanceState()メソッドを呼び出します画面が回転しますonRestoreInstanceState()を呼び出します。ただし、アクティビティがバックグラウンドに入って表示されるようになると、アクティビティはonRestoreInstanceState()を呼び出しません。システムは、復元する必要のある状態情報がある場合にのみonRestoreInstanceState()を呼び出します。したがって、onRestoreInstanceState()メソッドでは、バンドルがnullかどうかを判断する必要はありません。これは、onRestoreInstanceState()メソッドも意味します。 onRestoreInstanceState()が呼び出されたときにも呼び出す必要があります。呼び出されます。ただし、バンドル内のデータがonCreate()で復元される場合は、バンドルがnullであるかどうかを考慮する必要があります。

コードの練習:


import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class Main2Activity extends AppCompatActivity {
    
    
    private static final String TAG = "Main2Activity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Log.d(TAG, "onCreate: ");
    }

    @Override
    protected void onStart() {
    
    
        super.onStart();
        Log.d(TAG, "onStart: ");
    }
    
    @Override
    protected void onResume() {
    
    
        super.onResume();
        Log.d(TAG, "onResume: ");
    }
    
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
    
    
        // 去恢复父类的相应的层次结构
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, "onRestoreInstanceState: ");
    }

    @Override
    protected void onStop() {
    
    
        super.onStop();
        Log.d(TAG, "onStop: ");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
    
    
        Log.d(TAG, "onSaveInstanceState: ");
        // 存储相应的层次结构
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onDestroy() {
    
    
        super.onDestroy();
        Log.d(TAG, "onDestroy: ");
    }
}
  • ホーム出力に戻る:

2019-12-07 14:39:15.695 2928-2928 / com.example.lxd.fragmentlearn D / Main2Activity:onCreate:
2019-12-07 14:39:15.702 2928-2928 / com.example.lxd.fragmentlearn D / Main2Activity:onStart:
2019-12-07 14:39:15.706 2928-2928 / com.example.lxd.fragmentlearn D / Main2Activity:onResume:
2019-12-07 14:39:20.502 2928-2928 / com.example.lxd .fragmentlearn D / Main2Activity:onStop:
2019-12-07 14:39:20.503 2928-2928 / com.example.lxd.fragmentlearn D / Main2Activity:onSaveInstanceState:

onStop()メソッドが呼び出された後にonSaveInstanceStateが呼び出されることがわかります。

  • 戻るボタンをクリックして出力します

2019-12-07 14:40:11.914 3414-3414 /?D / Main2Activity:onCreate:
2019-12-07 14:40:11.921 3414-3414 /?D / Main2Activity:onStart:
2019-12-07 14:40:11.926 3414-3414 /?D / Main2Activity:onResume:
2019-12-07 14:40:14.080 3414-3414 / com.example.lxd.fragmentlearn D / Main2Activity:onStop:
2019-12-07 14:40:14.086 3414-3414 / com.example .lxd.fragmentlearn D / Main2Activity:onDestroy:

また、onSaveInstanceStateは呼び出されません。

同時に、上記の2つのケースでは、アクティビティが開かれたときにonRestoreInstanceStateメソッドは実行されません。

  • 画面を回転させる

2019-12-07 14:44:27.636 5123-5123 / com.example.lxd.fragmentlearn D / Main2Activity:onCreate:
2019-12-07 14:44:27.642 5123-5123 / com.example.lxd.fragmentlearn D / Main2Activity:onStart:
2019-12-07 14:44:27.647 5123-5123 / com.example.lxd.fragmentlearn D / Main2Activity:onResume:
2019-12-07 14:44:30.394 5123-5123 / com.example.lxd .fragmentlearn D / Main2Activity:onStop:
2019-12-07 14:44:30.394 5123-5123 / com.example.lxd.fragmentlearn D / Main2Activity:onSaveInstanceState:
2019-12-07 14:44:30.397 5123-5123 / com .example.lxd.fragmentlearn D / Main2Activity:onDestroy:
2019-12-07 14:44:30.615 5123-5123 / com.example.lxd.fragmentlearn D / Main2Activity:onCreate:
2019-12-07 14:44:30.620 5123 -5123 / com.example.lxd.fragmentlearn D / Main2Activity:onStart:
2019-12-07 14:44:30.623 5123-5123 / com.example.lxd.fragmentlearn D / Main2Activity:onRestoreInstanceState:
2019-12-07 14:44:30.625 5123-5123 / com.example.lxd.fragmentlearn D / Main2Activity:onResume:

画面を回転させるとonRestoreInstanceStateメソッドが呼び出され、onRestoreInstanceStateメソッドが呼び出される前にonSaveInstanceSateメソッドが呼び出されますが、この例は、システムがonRestoreInstanceSateの前にonSaveInstanceStateメソッドを呼び出すことを示していません。検証メソッドをご存知の場合は、ありがとうございます。私に知らせてください。

おすすめ

転載: blog.csdn.net/liu_12345_liu/article/details/103434783