[アンドロイド]Activityライフサイクル
この文章は姜先生のアンドロイドプログラミングを見て書いたものだ.
アクティブライフサイクル
アクティブ状態(アクティブ運転):現在のアクティブスクリーン出力、ユーザイベント処理正常状態 一時停止状態(一時停止):現在のアクティビティが一時的に無効になっている 非アクティブ(stop): の画面は、現在のアクティビティによって完全に隠されています.
アクティビティはユーザー画面に表示され、フォーカスがあり、ユーザーイベントに応答できます.作成されたアクティビティは、onCreate()->onStart()->onResume()関数を呼び出すとアクティブになります.
通常、setContentView()関数を使用してアクティブな画面を出力します.setContentView()関数を呼び出す時点は、画面出力の瞬間ではなく、onResume()関数を実行し、setContentView()関数から出力される内容が画面に表示されるように構成されています.したがって、onCreate()、onStart()およびonResume()でsetContentView()を呼び出すと、レイアウトが画面に出力されます.
静止状態は、アクティブが画面に表示されますが、フォーカスはありません.1つの典型的な例は、別のアクティブデバイスが半透明で実行されたり、ダイヤルアップで実行されたりしても、自分の画面が表示されますが、フォーカスが失われた状態です.ただし、一時停止状態で停止する場合がありますが、通常は「一時停止」(onStop)に切り替える前に呼び出され、停止することを示します.一時停止状態の場合、onPause()関数が自動的に呼び出されます.
onPause()関数では、通常、次のことを推奨します.アニメーションまたはその他のCPU消費の原因となるダウンタイム アクティブデバイス(例えば、 GPS)の一時停止中に不要な動作を停止する .
これらの停止がonPause()関数で実行されるのは、上記の操作が停止状態で実行を継続する必要がないため、onPause()関数が停止して再びアクティブになった場合に実行を継続します.
一時状態例
非アクティブ状態は、他のアクティブデバイスによって画面が完全に隠された状態です.たとえば、画面は別のアクティブなデバイスに切り替わり、表示されません.これにより、onPause()->onStop()関数が呼び出されます.非表示画面のアクション(たとえば、次の画面のアクションデバイスから戻るボタン)が消えた場合、アクションは再びアクティブに変換され、onRestart()->onStart()->onResume()関数が順次呼び出されます.
MainActivitySecondActivityBack to MainActivityの例では、最初に実行されたアクティビティがアクティブになり、ユーザーがボタンを押して別のアクティビティに切り替え、「戻る」ボタンをクリックして元のアクティビティのライフサイクルに戻ります.
アプリケーションが閉じると、データベースなどのデータ永続化を使用してデータを保存できます.ただし、アプリケーション以外のactivityは意外に終了する可能性があります.典型的な例は、スクリーンの回転です.画面が回転すると、アクティビティが閉じて再起動されます.ライフサイクルは、onResume()に呼び出されたアクティブデバイスで画面回転が発生したときに、onPause()->onStop()->onDestory()を呼び出して終了します.その後、onCreate()->onStart()->onResume()が再び呼び出されます.画面は再表示されますが、onResume()の実行後に発生したイベントまたはネットワークによってデータが失われると、これらはすべて失われます.
画面回転電話面回転後
上記の例に示すように、ユーザーがCountボタンを押して値を増加させると、画面を回転させると正常に表示されますが、データはonDestory()に戻った後に消えます. データの保存後にアクティビティを再起動したときにデータをリカバリおよび使用するためのライフサイクル関数が含まれています.を参照
onSaveInstanceState()とonRestoreInstanceState()関数は、APIレベルの21バージョンから2つのパラメータ付き関数を追加します.関数を呼び出すとき、パラメータは関数の違いです.
また、1つのパラメータonRestoreInstanceState()関数は、画面を回転させてアクティビティを再起動するときに無条件に呼び出されますが、Bundleに格納されているデータがない場合、2つのパラメータを持つonRestoreInstanceState()関数は呼び出されません.
アクティブライフサイクル
Androidアプリケーションは、「アプリケーション」、「サービス」、「コンテンツプロバイダ」、「ブロードキャストトランシーバ」の4つのコンポーネントを組み合わせて開発されています.最も使用頻度が高く、ライフサイクルが最も複雑なコンポーネントであるアクティビティデバイスについて説明します.
1ライフサイクル
アクティブなデバイスは、実行から終了まで多くのステータスが変化し、ステータスが変化するたびにライフサイクル関数が自動的に呼び出されます.アクティビティのステータスには、アクティビティ、一時停止、非アクティビティが含まれます.
1.1活動状態
アクティビティはユーザー画面に表示され、フォーカスがあり、ユーザーイベントに応答できます.作成されたアクティビティは、onCreate()->onStart()->onResume()関数を呼び出すとアクティブになります.
通常、setContentView()関数を使用してアクティブな画面を出力します.setContentView()関数を呼び出す時点は、画面出力の瞬間ではなく、onResume()関数を実行し、setContentView()関数から出力される内容が画面に表示されるように構成されています.したがって、onCreate()、onStart()およびonResume()でsetContentView()を呼び出すと、レイアウトが画面に出力されます.
1.2一時停止状態
静止状態は、アクティブが画面に表示されますが、フォーカスはありません.1つの典型的な例は、別のアクティブデバイスが半透明で実行されたり、ダイヤルアップで実行されたりしても、自分の画面が表示されますが、フォーカスが失われた状態です.ただし、一時停止状態で停止する場合がありますが、通常は「一時停止」(onStop)に切り替える前に呼び出され、停止することを示します.一時停止状態の場合、onPause()関数が自動的に呼び出されます.
onPause()関数では、通常、次のことを推奨します.
これらの停止がonPause()関数で実行されるのは、上記の操作が停止状態で実行を継続する必要がないため、onPause()関数が停止して再びアクティブになった場合に実行を継続します.
1.3非アクティブ状態
非アクティブ状態は、他のアクティブデバイスによって画面が完全に隠された状態です.たとえば、画面は別のアクティブなデバイスに切り替わり、表示されません.これにより、onPause()->onStop()関数が呼び出されます.非表示画面のアクション(たとえば、次の画面のアクションデバイスから戻るボタン)が消えた場合、アクションは再びアクティブに変換され、onRestart()->onStart()->onResume()関数が順次呼び出されます.
MainActivitySecondActivityBack to MainActivity
1.2活動状態の保存
アプリケーションが閉じると、データベースなどのデータ永続化を使用してデータを保存できます.ただし、アプリケーション以外のactivityは意外に終了する可能性があります.典型的な例は、スクリーンの回転です.画面が回転すると、アクティビティが閉じて再起動されます.ライフサイクルは、onResume()に呼び出されたアクティブデバイスで画面回転が発生したときに、onPause()->onStop()->onDestory()を呼び出して終了します.その後、onCreate()->onStart()->onResume()が再び呼び出されます.画面は再表示されますが、onResume()の実行後に発生したイベントまたはネットワークによってデータが失われると、これらはすべて失われます.
画面回転電話面回転後
上記の例
// 액티비티 종료되는 상황에 액티비티의 데이터를 저장
// Bundle은 컴포넡트의 데이터를 저장하기 위한 일종의 Map 객체
// Key - Value 형식으로 데잉터를 저장
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("data1", "hello")
outState.putInt("data2", 100)
}
まずはonSaveInstanceState.onPause()関数を呼び出すと自動的に呼び出され、この関数にデータが格納されます.保存方法は、パラメータを使用して渡されるBundleオブジェクトです.Bundleは、エレメント内のデータを格納するためのMapオブジェクトで、キー値形式でデータを書き込むだけです.// 액티비티가 다시 시작하면서 호출되는데 매개변수로 Bundle 객체가 넘어온다.
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
// Bundle 객체를 사용하여 해당하는 값 가져오기
val data1 = savedInstanceState.getString("data1")
val data2 = savedInstanceState.getInt("data2")
val toast = Toast.makeText(this, "$data1 : $data2", Toast.LENGTH_SHORT)
toast.show()
}
// Bundle 객체가 매개변수로 넘어온다
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val data1 = savedInstanceState?.getString("data1")
val data2 = savedInstanceState?.getInt("data2")
val toast = Toast.makeText(this, "$data1 : $data2", Toast.LENGTH_SHORT)
toast.show()
}
アクティビティが再起動されると、onCreate()とonRestoreInstanceState()が呼び出され、格納されたデータがパラメータとしてBundleに格納されます.これらの関数を使用して、保存した値を読み込みます.onSaveInstanceState()とonRestoreInstanceState()関数は、APIレベルの21バージョンから2つのパラメータ付き関数を追加します.関数を呼び出すとき、パラメータは関数の違いです.
override fun onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle) {
super.onSaveInstanceState(outState, outPersistentState)
}
override fun onRestoreInstanceState(
savedInstanceState: Bundle?,
persistentState: PersistableBundle?
) {
super.onRestoreInstanceState(savedInstanceState, persistentState)
}
onSaveInstanceState()関数は、onPause()関数を呼び出した後に自動的に呼び出されるパラメータです.画面が回転するのではなく、別のアクティブなデバイスに切り替わると、画面も呼び出されます.ただし、onPuase()関数を呼び出すと、2つのパラメータを持つonSaveInstanceState()関数は無条件に呼び出されず、画面回転などのアクティブなデバイスが終了した場合にのみ呼び出されます.また、1つのパラメータonRestoreInstanceState()関数は、画面を回転させてアクティビティを再起動するときに無条件に呼び出されますが、Bundleに格納されているデータがない場合、2つのパラメータを持つonRestoreInstanceState()関数は呼び出されません.
Reference
この問題について([アンドロイド]Activityライフサイクル), 我々は、より多くの情報をここで見つけました https://velog.io/@changhee09/액티비티-생명주기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol