티스토리 뷰
android app 개발을 할 때, Life Cycle에 맞춰 개발을 하는 것이 중요하기 때문에 한번 정리해 보았습니다.
함수명 | 설명 | 다음에 호출하는 함수 | Killable? |
onCreate() | Activity가 생성되면 가장 먼저 실행, 전체 생명 주기동안 한번만 발생해야 하는 기본 어플리케이션의 시작로직을 실행하는 함수 | onStart() | No |
onStart() | Activity가 사용자에게 표시되기 전에 호출되는 함수 UI를 관리하는 코드를 초기화 하는 함수 Activity가 화면에 나오면 onResume()을, 숨겨지면 onStop()을 차례로 수행합니다. | onResume()/onStop() | No |
onResume() | Activity가 사용자와 상호 작용을 시작할 때 호출되는 함수 이때 Activity는사용자 입력과 함께 Activity Stack의 맨 위에 표시되며, 항상 다음에 onPause()가 뒤따릅니다. | onPause() | No |
onPause() | Activity의 포그라운드 상태가 손실되거나 포커스를 더 이상 사용할 수 없거나 Stop/hidden, Destroy 상태로 전환되기 전 또는 이전 Activity가 재개되려고 할 때 호출되는 함수 (다른 Activity가 실행 되어 Activity Stack의 맨 위에 올라가는 경우 호출) 이 메서드가 반환될 때까지 다음 활동이 재개되지 않으므로(사용자로 부터 어떠한 입력도 받을 수 없고 어떤 코드도 실행할 수 없는 상태) 이 메서드를 매우 신속하게 구현해야 합니다. Activity는 여전히 사용자에게 표시되므로 UI를 계속 업데이트하는 것이 좋습니다. 이어서 Activity가 다시 화면으로 돌아가면 onResume()를, 사용자가 볼 수 없는 경우에는 onStop()를 차례로 수행합니다. |
onResume()/onStop() | Yes |
onStop() | Activity가 사용자에게 더 이상 표시되지 않으면 호출된다. 이 문제는 새로운 Activity가 맨 위에 시작되거나 기존 Activtiy가 이 Activity 앞에 도입되거나 이 Activity가 파괴되면 발생할 수 있습니다. 일반적으로 애니메이션을 중지하고 UI를 새로 고치는 데 사용됩니다. 그 다음, 이 Activity가 사용자와 상호 작용하기 위해 다시 시작되는 경우 onRestart()에서, 또는 Activity가 중단되는 경우 onDestroy()에서 차례로 진행된다. |
onRestart()/onDestroy() | Yes |
onRestart() | Activity가 onStop()이 호출된 후 다시 시작하기 전에 호출된다. 항상 다음에 onStrat()를 호출 | onStart() | No |
onDestory() | 시스템이 Activity를 종료하기 전에 받는 마지막 함수이다. 이 문제는 작업이 완료 중이거나 시스템이 공간을 절약하기 위해 이 작업 인스턴스를 일시적으로 폐기하기 때문에 발생할 수 있는데, isFinishing() 메서드를 사용하여 이 두 시나리오를 구분할 수 있습니다. | X | Yes |
Activity 생성 -> Create 상태 -> XML파일 정의 ViewGroup을 setContentView()에 전달하여 레이아웃을 사용
onCreate() 메서드가 실행을 완료하면, Start상태가 되고, 시스템이 onStart(), onResume() 메서드 호출
onStart() 메서드는 매우 빠르게 완료되며, Activity는 Creat 상태와 같이 Start 상태에 머무르지 않는다. 이 메서드가 완료되면, Resume 상태에 들어가고, 시스템이 onResume() 메서드 호출
Activity가 Resume 상태에 들어가면, 화면에 표시되고 시스템이 onResume() 메서드를 호출 어떠한 이벤트(전화가 오거나, 사용자가 다른 Activity로 이동하거나, 기기의 화면이 꺼질 때)가 발생하여 앱에서 포커스가 떠날 때 까지 해당 상태를 유지한다. 이 상태에서 수명 주기 구성요소가 화면에서 사용자에게 보이는 동안 실행해야 하는 모든 기능을 활성화할 수 있습니다. (예: 카메라 미리보기 시작), 방해되는 이벤트가 발생하면 Pause 상태에 들어가고, 시스템이 onPause() 메서드를 호출
Activity가 Pause 상태에서 Resume 상태로 돌아오면 시스템이 onResume() 메서드를 다시 호출 따라서, onResume()을 구현하여 onPause 중에 해제하는 구성요소를 초기화하고, Activity가 Resume 상태로 전환될 때마다 필요한 다른 초기화 작업도 수행해야 합니다.
시스템은 사용자가 Activity를 떠나는 것을 나타내는 첫 번째 신호로 onPause() 메서드를 호출합니다(하지만 해당 Activity가 항상 소멸되는 것은 아님). Activity가 화면에 있지 않게 되었다는 것을 나타냅니다(다만 사용자가 멀티 윈도우 모드에 있을 경우에는 여전히 표시 될 수도 있음). Activity가 Pause 상태일 때 계속 실행(또는 적절히 계속 실행)되어서는 안 되지만 onPause()메서드를 사용하여 잠시 후 다시 시작할 작업을 일시중지하거나 조정합니다. Activity가 이 상태에 들어가는 이유는 여러 가지가 있습니다
- Android 7.0(API 수준 24) 이상에서는 여러 앱이 멀티 윈도우 모드에서 실행됩니다. 언제든지 그중 하나의 앱(창)만 포커스를 가질 수 있기 때문에 시스템이 그 외에 모든 다른 앱을 일시중지시킵니다.
- 새로운 반투명 Activity(예: 대화상자)이 열립니다. Activity는 여전히 부분적으로 보이지만 포커스 상태가 아닌 경우에는 Pause 상태로 유지됩니다.
여기에서 수명 주기 구성요소는 구성요소가 화면에 있지 않을 때 실행할 필요가 없는 기능을 모두 정지할 수 있습니다(예: 카메라 미리보기 정지) onPause() 메서드를 사용하여 시스템 리소스, 센서 핸들(예: GPS) 또는 Activity가 Pause 상태이고 사용자가 필요로 하지 않을 때 배터리 수명에 영향을 미칠 수 있는 모든 리소스를 해제할 수도 있습니다
멀티 윈도우 모드에서 여전히 완전히 보이는 상태일 수 있습니다. 그러므로 멀티 윈도우 모드를 더욱 잘 지원하기 위해 UI 관련 리소스와 작업을 완전히 해제하거나 조정할 때는 onPause() 대신 onStop()을 사용하는 것이 좋습니다.
onPause()는 아주 잠깐 실행되므로 저장 작업을 실행하기에는 시간이 부족할 수 있습니다. 그러므로 onPause()를 사용하여 애플리케이션 또는 사용자 데이터를 저장하거나, 네트워크 호출을 하거나, 데이터베이스 트랜잭션을 실행해서는 안 됩니다. 이러한 작업은 메서드 실행이 끝나기 전에 완료되지 못할 수도 있습니다. 그 대신, 부하가 큰 종료 작업은 onStop() 상태일 때 실행해야 합니다.
Activity가 사용자에게 더 이상 표시되지 않으면 Stop 상태에 들어가고, 시스템은 onStop()메서드를 호출합니다. 수명 주기 구성요소는 구성요소가 화면에 보이지 않을 때 실행할 필요가 없는 기능을 모두 정지할 수 있습니다. onStop() 메서드에서는 앱이 사용자에게 보이지 않는 동안 앱은 필요하지 않은 리소스를 해제하거나 조정해야 합니다. 예를 들어 앱은 애니메이션을 일시중지하거나, 대략적인 위치 업데이트에서 세밀한 업데이트로 전환할 수 있다. 또한 onStop()메서드르 사용하여 CPU를 비교적 많이 소모하는 종료 작업을 실행할 수 있다. 예를 들어 정보를 데이터베이스에 저장할 적절한 시기를 찾지 못했다면 onStop() 상태일 때 저장할 수 있습니다 Activity는 정지됨 상태에서 다시 시작되어 사용자와 상호작용하거나, 실행을 종료하고 사라집니다. Activity가 다시 시작되면 시스템은 onRestart()를 호출하고, Activity가 실행을 종료하면 시스템은 onDestroy()를 호출합니다.
onDestroy는 Activity가 소멸되기 전에 호출됩니다. 시스템은 다음 중 하나에 해당할 때 이 콜백을 호출합니다.
- (사용자가 Activity를 완전히 닫거나 Activity에서 finish()가 호출되어) Activity가 종료되는 경우
- 구성 변경(예: 기기 회전 또는 멀티 윈도우 모드)으로 인해 시스템이 일시적으로 Activity를 소멸시키는 경우
Activity가 Destroy 상태로 전환하면 수명 주기 구성요소는 Activity가 소멸되기 전에 필요한 것을 정리할 수 있습니다.
Activity가 구성 변경으로 인해 다시 생성될 경우 ViewModel은 그대로 보존되어 다음 Activity 인스턴스에 전달되므로 추가 작업이 필요하지 않습니다.
Activity가 다시 생성되지 않을 경우 ViewModel은 onCleared() 메서드를 호출하여 Activity가 소멸되기 전에 모든 데이터를 정리해야 합니다.
이와 같은 두 가지 시나리오는 isFinishing() 메서드로 구분할 수 있습니다.
Activity가 종료되는 경우 onDestroy()는 Activity가 수신하는 마지막 call back이 된다.
구성 변경으로 인해 onDestroy()가 호출되는 경우 시스템이 즉시 새 활동 인스턴스를 생성한 다음, 새로운 구성에서 그 새로운 인스턴스에 관해 onCreat()를 호출합니다.
onDestroy() call back은 이전의 call back에서 아직 해제되지 않은 모든 리소스(예: onStop())를 해제해야 합니다.
Killable에 "Yes"로 표시된 메서드의 경우, 해당 메서드가 반환된 후 다른 코드 라인 없이 언제든지 시스템에서 작업을 호스팅하는 프로세스가 경고없이 언제든지 시스템에 의해 중단 될 수 있습니다. 따라서 스토리지에 영구 데이터(예: 사용자 편집)를 쓰려면 onPause() 메서드를 사용해야 합니다. 또한 SaveInstanceState(Android.os)의 메서드입니다.번들)은 작업을 백그라운드 상태로 전환하기 전에 호출되므로 Activity의 동적 인스턴스 상태를 지정된 번들로 저장할 수 있으며, 나중에 작업을 다시 생성해야 하는 경우 onCreate(번들)에서 받을 수 있습니다. 영구 데이터는 수명 주기 call back의 일부가 아니므로 영구 데이터를 SaveInstanceState(Bundle)가 아니라 onPause()에 저장하는 것이 중요하다.
출처:https://developer.android.com/reference/android/app/Activity#ActivityLifecycle
https://developer.android.com/guide/components/activities/activity-lifecycle
'Android & Kotlin' 카테고리의 다른 글
Activity 와 Fragment (0) | 2021.05.22 |
---|---|
Kotlin 고급 문법 정리 (0) | 2021.05.16 |
Android Studio .idea 에 있는 file들은 무엇인가? (0) | 2021.05.11 |
Kotlin 기본 문법 정리 (0) | 2021.05.06 |
Hiding API Keys (0) | 2021.04.22 |