Android知識点まとめ(五)Activityキャッシュ方法

7650 ワード

転入先https://www.jianshu.com/p/eac026497f14
関連記事:
Androidナレッジポイントまとめ(カタログ)https://blog.csdn.net/a136447572/article/details/81027701
Activityキャッシュメソッド
ActivityのonCreateメソッドにはBundle savedInstancesStateオブジェクトがあることを知っていますが、BundleというAPIでの定義は、A mapping from String keys to various{@link Parcelable}valuesです.mapオブジェクトです.
したがって、Activityでキャッシュする方法はBundleから始め、Activityではキャッシュとキャッシュを取るための2つの方法を提供します.onSaveInstanceState(Bundle outState), onRestoreInstanceState(Bundle savedInstanceState).
さぎょう
ActivityのonSaveInstanceStateとonRestoreInstanceStateは、onCreate()やonStart()などのライフサイクルメソッドと同様に、一定の順序で実行されるわけではありません.この2つの方法は、必ずしも毎回実行されるとは限らず、特定の場合にのみトリガーされます.たとえば、メモリ不足、画面の回転、ホームの押下、ホームの長押しによる他のアプリケーションの起動など、アプリケーションがシステムによってActivityを破棄されると、onSaveInstanceStateがトリガーされます.ユーザーがActivityを自発的に破棄した場合、呼び出されません.したがって、通常、onSaveInstancesStateは一時的な状態を保存するのに適しており、onPause()はデータの永続化保存に適しています.
onSaveInstanceState
まずApplication Fundamentalsの話を見てみましょう.
​ Android calls onSaveInstanceState() before the activitybecomes vulnerable to being destroyed by the system, but does not bothercalling it when the instance is actually being destroyed by a user action (suchas pressing the BACK key).
この言葉から分かるように、あるactivityが「容易」にシステムによって破棄されると、例えばユーザがBACKキーを押すと、activityがユーザによって自発的に破棄されない限り、activityのonSaveInstanceState()が実行される.
上の二重引用符に注意してください.「簡単」とは何ですか.このactivityはまだ破棄されておらず、可能性にすぎないという意味です.この可能性はどれらがありますか?onSaveInstanceState()およびonRestoreInstanceState()メソッドを含むactivityのすべてのライフサイクルのonXXXメソッドを書き換えることで、あるactivity(activity Aと仮定)が現在のtaskの最上位に表示された場合、そのonSaveInstanceState()メソッドがいつ実行されるかを明確に知ることができます.
1ユーザがHOMEキーを押すと.
これは明らかで、システムはあなたがHOMEを押した後にどれだけ他のプログラムを実行するかを知らないで、自然にactivity Aが破棄されるかどうか分からないので、システムはonSaveInstancesState()を呼び出して、ユーザーにいくつかの非永久的なデータを保存する機会を与えます.
2 HOMEキーを長押しし、他のプログラムを実行する場合を選択します.
3電源ボタン(画面表示をOFF)を押した場合.
4 activity Aから新しいactivityを起動したとき.
5画面方向切り替えの場合、例えば縦画面から横画面に切り替えた場合.
注意:
onSaveInstanceStateメソッドでは、superをデフォルトで実装します.onSaveInstanceState(outState);このメソッドでは、ActivityのUIステータスがデフォルトで自動的に保存されます.たとえば、Edittextが入力した値は復元され、CheckBoxコントロールではチェックステータスが自動的に保存されます.ここでは、android:idプロパティを設定することで、これらのコントロールに一意のIdを指定する条件があります.残りはonSaveInstanceStateに任せて自動的に完了します.
onSaveInstanceStateはUIに関するステータスデータしか保存しないので、いつこの方法を書き直す必要がありますか?追加のデータを保存する必要がある場合は、onSaveInstanceState()メソッドを上書きする必要があります.**
onSaveInstanceState()メソッドは不確実性を呼び出すので、UIコントロールの状態、メンバー変数の値などの過渡データを保存するのに適しており、永続化されたデータを保存するのには使用できません.永続化データは、ユーザーが現在のactivityを離れたときにonPause()に保存する必要があります(データベースやファイルにデータを保存するなど).
onRestoreInstanceState
onRestoreInstanceStateとonSaveInstanceStateはペアではなく、onSaveInstanceStateを呼び出すとonRestoreInstanceStateの呼び出しが現れない場合があります.たとえばhomeキーを押してデスクトップに戻ると、すぐに元のアプリケーションActivityに戻り、onRestoreInstanceStateは呼び出されません.このときのActivityは破棄されていないので、onRestoreInstanceStateは呼び出されません.
onRestoreInstanceState()は、onStart()とonPostCreate(Bundle)の間で呼び出されます.この呼び出し順序に注意してください.
コード:
public class InstanceStateActivity extends Activity {

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

        LogHelper.i("*****onCreate()  ******");
        LogHelper.i( "onCreate:" + getClass().getSimpleName() + " TaskId: " + getTaskId() + " hasCode:" + this.hashCode());

        setContentView(R.layout.test_standar_activity);

        findViewById(R.id.start).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(InstanceStateActivity.this,StandardActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        LogHelper.i("*****onRestart()  ******");
    }

    @Override
    protected void onStart() {
        super.onStart();
        LogHelper.i("*****onStart()  ******");
    }

    @Override
    protected void onResume() {
        super.onResume();
        LogHelper.i("*****onResume()  ******");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean("testBoolean", true);
        outState.putDouble("testDouble", 2.0);
        outState.putInt("testInt", 1);
        outState.putString("testString", "Test Android");



        LogHelper.i("*****onSaveInstanceState()  ******");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        boolean testBoolean = savedInstanceState.getBoolean("testBoolean");
        double testDouble = savedInstanceState.getDouble("testDouble");
        int testInt = savedInstanceState.getInt("testInt");
        String testString = savedInstanceState.getString("testString");

        LogHelper.i("*****onRestoreInstanceState()  ******");

        LogHelper.i("*****testBoolean "+testBoolean+", testDouble "+testDouble+", testInt "+testInt+", testString "+testString);
    }
}