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)の間で呼び出されます.この呼び出し順序に注意してください.
コード:
関連記事:
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);
}
}