Activityが破棄された場合のキャッシュ方法

4464 ワード

【声明:】本文は作者(キノコv 5)のオリジナルで、著作権は作者のキノコv 5の所有で、権利侵害は必ず追及します.本文は先発している.転送する場合は、作者とソースアドレスを明記してください.無断転載は厳禁!
a、bの2つのActivityがあり、aからbに入ってからしばらくすると、システムがaを回収する可能性があります.このときbackを押すと、aのonRestartではなくonCreateメソッドが実行され、aが再作成され、aの一時的なデータと状態が失われる可能性があります.
ActivityのonSaveInstanceState()コールバックメソッドで一時的なデータとステータスを保存できます.このメソッドは、必ずアクティビティが回収される前に呼び出されます.メソッドにはBundleパラメータがあり、putString()、putInt()などのメソッドは2つのパラメータを入力し、1つのキーと1つの値を入力する必要があります.データが保存されるとonCreateで復元され、onCreateにもBundleタイプのパラメータがあります.
サンプルコード:
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // , Acivity 
        // 
        if( savedInstanceState != null ){
            savedInstanceState.getString("anAnt");
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putString("anAnt","Android");

    }

一、onSaveInstanceState(Bundle outState)
あるactivityが「容易」にシステムによって破棄されると、例えばユーザがBACKキーを押すと、activityがユーザによって自発的に破棄されない限り、activityのonSaveInstancesStateが実行される.
上の二重引用符に注意してください.「簡単」とは何ですか.このactivityはまだ破棄されておらず、可能性にすぎないという意味だ.この可能性はどれらがありますか?onSaveInstanceStateメソッドとonRestoreInstanceStateメソッドを含むactivityのすべてのライフサイクルのonXXXメソッドを書き換えることで、あるactivity(activity Aと仮定)が現在のtaskの最上位に表示された場合、そのonSaveInstanceStateメソッドがいつ実行されるかを明確に知ることができます.
  • ユーザがHOMEキーを押すとき
  • .
    これは明らかで、システムはあなたがHOMEを押した後にどれだけ他のプログラムを実行するかを知らないで、もちろんactivity Aが破棄されるかどうか分からないので、システムはonSaveInstancesStateを呼び出して、ユーザーにいくつかの非永久的なデータを保存する機会を与えます.以下のいくつかの状況の分析はすべてこの原則に従う.
  • HOMEキーを長押しし、他のプログラムを実行する場合を選択します.
  • 電源ボタン(画面表示をOFF)を押した場合.
  • activity Aから新しいactivityが起動されたとき.
  • 画面方向切り替えの場合、例えば縦から横に切り替えた場合.(configchangeプロパティを指定しない場合)画面切り替えの前にactivity Aが破棄され、画面切り替え後に自動的にactivity Aが作成されるので、onSaveInstanceStateは必ず
  • 実行されます.
    要するに、onSaveInstanceStateの呼び出しは、システムが「許可されていない」ときにactivityを破棄すると、onSaveInstanceStateがシステムに呼び出されるという重要な原則に従います.これはシステムの責任です.データを保存する機会を提供しなければならないからです(もちろん、保存しないなら勝手にしてください).また、注意すべき点は次のとおりです.
  • レイアウトの各ViewデフォルトではonSaveInstanceState()メソッドが実装されています.これにより、このUIの変更は自動的に格納され、activityが再作成されたときに自動的に復元されます.しかし、この場合、このUIに一意のIDを提供してからのみ機能し、IDが提供されていない場合、appはその状態を格納しません.
  • デフォルトのonSaveInstanceState()メソッドの実装は、UIがそのステータスを格納するのに役立つため、このメソッドを上書きして追加のステータス情報を格納する必要がある場合は、任意のコードを実行する前に親のonSaveInstanceState()メソッド(super.onSaveInstanceState()を呼び出す必要があります.既存のものがある以上、私たちは果たして自分でonSaveInstanceState()を実現しないのだろうか.これは状況によって異なります.もしあなたの派生クラスに変数がUIに影響したり、プログラムの動作に影響したりしたら、もちろんこの変数も保存しなければなりません.そうしないと、自分で実現する必要があります.そうしないと、必要ありません.
  • onSaveInstanceState()メソッド呼び出しの不確実性のため、activityの瞬間状態(UIの状態)を記録するには、このメソッドのみを使用します.この方法で永続化データを格納するべきではない.ユーザーがこのactivityを離れるときは、onPause()メソッドに永続化されたデータ(例えば、データベースに格納されるべきデータ)を格納する必要があります.
  • onSaveInstanceState()が呼び出されると、このメソッドはonStop()の前にトリガーされますが、onPause()の前または後にトリガーされるかどうかは保証されません.

  • 二、onRestoreInstanceState(Bundle outState)
    onRestoreInstanceStateメソッドについては、onSaveInstanceStateメソッドとonRestoreInstanceStateメソッドがペアで呼び出されているとは限らないことに注意してください.
    onRestoreInstanceStateが呼び出される前提は、activity Aが「確かに」システムによって破棄されたことであり、このような可能性がある場合のみ、この方法は呼び出されない.例えば、activity Aが表示されている間に、ユーザはHOMEキーを押してメインインタフェースに戻り、その後、ユーザはactivity Aに戻る.この場合、activity Aはメモリのせいでシステムによって破棄されないのが一般的である.したがってactivity AのonRestoreInstanceStateメソッドは実行されません
    また、onRestoreInstanceStateのbundleパラメータもonCreateメソッドに渡され、onCreateメソッドでデータ復元を選択することもできます.またonRestoreInstancesStateはonstartの後に実行されます.この2つの関数の使用については、superを呼び出す前または後にカスタムコードが表示されます.
    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
            savedInstanceState.putBoolean("MyBoolean", true);
            savedInstanceState.putDouble("myDouble", 1.9);
            savedInstanceState.putInt("MyInt", 1);
            savedInstanceState.putString("MyString", "Welcome back to Android");
            // etc.
            super.onSaveInstanceState(savedInstanceState);
    }
    
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
            super.onRestoreInstanceState(savedInstanceState);
    
            boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
            double myDouble = savedInstanceState.getDouble("myDouble");
            int myInt = savedInstanceState.getInt("MyInt");
            String myString = savedInstanceState.getString("MyString");
    }