따로 개념을 확실히 잡지 않고 무작정 UI와 이벤트 처리들을 다루다보니 이 흐름이 어떻게 되는 흐름인지도 모르고 뭐가 조금만 바뀌면 새로 적응하는데 있어 어려움을 겪었다.
그래서 일단 기초적인 생명주기를 먼저 알아보려한다.
참고한 사이트는 안드로이드 디벨로퍼즈의
https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko
해당 사이트이다.
안드로이드 디벨로퍼즈에 올라와있는 그림이다.
생명 주기 단계를 전환하기 위해 총 6가지 콜백을 구성된 OnCreate(), onStart(),onResume, onPause(), onStop(), onDestroy()를 지원한다.
시스템은 사용자가 현재 액티비티를 떠나는 것을 나타내는 첫 번째 신호로 onPause를 호출(하지만 해당 활동이 항상 소멸되는 것은 아님)
액티비티가 포그라운드에 있지 않게 되었다는 것을 나타낸다.(다만 사용자가 멀티 윈도우 모드에 있을 경우에는 여전히 표시 될 수도 있음).
-Activity가 일시중지됨 상태일 때 잠시 후 다시 시작할 작업을 일시중지하거나 조정합니다.
API 수준 24 이상에서는 여러 앱이 멀티 윈도우 모드에서 실행된다. 그렇기에 언제든지 그중 하나의 앱만 포커스를 가질 수 있기 때문에 시스템이 그 외에 모든 다른 앱을 일시중지시킨다.
[onPause보다 onStop이 좋은 경우1]
일시중지된 활동은 멀티 윈도우 모드에서 여전히 보일 수 있다. 그러므로 멀티 윈도우 모드를 더욱 잘 지원하기 위해 UI 관련 리소스와 작업을 완전히 해제하거나 조정할 때는 onPause() 대신 onStop()을 사용하는 것이 좋다.
[onPause보다 onStop이 좋은 경우2]
onPause()는 아주 잠깐 실행되므로 저장 작업을 실행하기에는 시간이 부족할 수 있다. 그러므로 onPause()를 사용하여 애플리케이션 또는 사용자 데이터를 저장하거나, 네트워크 호출을 하거나, 데이터베이스 트랜잭션을 실행해서는 안된다! 이러한 작업들은 메서드 실행이 끝나기 전에 완료되지 못할 수도 있기 떄문이다. 그 대신, 부하가 큰 종료 작업은 onStop() 상태일 때 실행해야 합니다.
활동이 사용자에게 더 이상 표시되지 않으면 중단됨 상태에 들어가고, 시스템은 onStop() 콜백을 호출. 예를 들어 새로 시작된 액티비티가 화면 전체를 차지할 경우에 적용됩니다.
시스템은 액티비티의 실행이 완료되어 종료될 시점에 onStop()을 호출할 수도 있다.
활동이 중단됨 상태로 전환하면 이 액티비티의 생명 주기와 연결된 모든 생명 주기 인식 구성요소는 ON_STOP 이벤트를 수신한다. 여기에서 수명 주기 구성요소는 구성요소가 화면에 보이지 않을 때 실행할 필요가 없는 기능을 모두 정지할 수 있다.
onStop() 메서드에서는 앱이 사용자에게 보이지 않는 동안 앱은 필요하지 않은 리소스를 해제하거나 조정해야 한다. 예를 들어 앱은 애니메이션을 일시중지하거나, 세밀한 위치 업데이트에서 대략적인 위치 업데이트로 전환할 수 있다. onPause() 대신 onStop()을 사용하면 사용자가 멀티 윈도우 모드에서 활동을 보고 있더라도 UI 관련 작업이 계속 진행됩니다.
활동이 소멸됨 상태로 전환하면 이 활동의 수명 주기와 연결된 모든 수명 주기 인식 구성요소는 ON_DESTROY 이벤트를 수신한다. 여기서 수명 주기 구성요소는 활동이 소멸되기 전에 필요한 것을 정리할 수 있다.
액티비티가 종료되는 경우 onDestroy()는 활동이 수신하는 마지막 수명 주기 콜백이 된다. 기기 회전 또는 멀티 윈도우 모드로 인해 onDestroy()가 호출되는 경우 시스템이 즉시 새 활동 인스턴스를 생성한 다음, 새로운 구성에서 그 새로운 인스턴스에 관해 onCreate()를 호출한다.
이전의 콜백에서 아직 해제되지 않은 모든 리소스(예: onStop())를 해제해야 한다.
(이해 완벽 X) - 활동에 소멸되는 이유를 결정하는 로직을 입력하는 대신 ViewModel 객체를 사용하여 활동의 관련 뷰 데이터를 포함해야 합니다. 활동이 구성 변경으로 인해 다시 생성될 경우 ViewModel은 그대로 보존되어 다음 활동 인스턴스에 전달되므로 추가 작업이 필요하지 않습니다. 활동이 다시 생성되지 않을 경우 ViewModel은 onCleared() 메서드를 호출하여 활동이 소멸되기 전에 모든 데이터를 정리해야 합니다.