수 많은 생명주기의 변화가 이뤄지는 Android의 Activity에서는 특정 상태일 때 처리해야 하는 일이 벌어진다.
예를들면 Pause상태일 때 연속적인 동작을 멈추던지 ex - 스트리밍, 애니메이션, Destroy상태일 때는 특정 객체의 관찰을 해제한다. 하지만, 어떠한 상황에서는 Activity가 Destroy됐지만 다시 ReCreate되는 상황이 발생한다. 이 때, 사용자는 같은 화면을 보고 있기에 동적인 작업이 진행되었을 때는 데이터를 보존시켜야 한다. 아마 여기서 onSavedInstance의 인자로 오는 Bundle에 보존시킬 데이터를 넣거나, 이번 주제인 쉽고 간편한 AAC ViewModel을 사용한다.
아마 ViewModel을 사용하려 검색해봤다면 위와 같은 그림을 수도 없이 보았을 거다.
여기서 궁금한게 있었다. Activity의 생명주기야 지겹도록 듣고 외우고 알았지만, 빨간색으로 표시된 부분인 onCleared()는 도대체 언제 호출이 되는걸까?
이 호출 원인을 알아야 된다고 생각한다. 단순히 화면 회전할 때 데이터 손실 방지용으로 쓰고 있는데 예상하지 못한곳에서 onCleared가 호출되면 버그로 이어지기 때문이다.
내가 가장먼저 했던건 당연히 ViewModel의 내부를 들여다 보는것이었다.
onCleared()를 호출하는 메서드가 clear()라는 메서드였다. 근데 내부에서 보면 null검사하고 동기화로 Map, Set객체인 mBagOfTags랑 mCloseables을 순회하며 데이터가 있으면 Exception을 발생시키는 구조인데, 뭔가 내가 원하던 그림이랑 달랐다.
그리고 이 clear()메서드도 누군가 호출해야 하는데 ViewModel Class에선 호출자가 보이지 않았다.
그래서 여기저기 찾아보니 답은 ViewModel이 아닌 Activtiy에 숨겨져 있었다.
단순한 AppCompatActivity는 아니었고 타고타고 들어가야 나오는 ComponentActivity Class였다.
생성자에서 Life Cycle을 관찰하면서 Event에 ON_DESTROY가 들어오면 isChangingConfigurations()메서드로 true false를 검사한다.
그럼 isChangingConfigurations는 뭐지?
계속 내부를 들어가다보니 빨간줄로 나오는데 이게 더 이상 보여줄 것이 없다는 건지 아니면 공개를 하지 않겠다는 건지는 모르겠으나 위 mChangingConfigurations를 초기화 시키는 메서드는 보이지 않았다. 다만 주석으로 해석해본다면
만약 이 액티비티가 새로운 구성을 재생성하기 위해 파괴된다면 true를 반환하고, 아니면 false를 반환한다.
주석만 보고 반대인데? 라며 살짝 당황했지만, 실제로 사용되는 부분에서는 not연산자를 추가하여 다시 제대로 돌아왔다.
즉, 다시 코드로 돌아가서 Destroy이벤트가 수신될 때 화면 재구성을 위한거라면 getViewModelStore로 ViewModelStore를 얻은 후 clear()를 호출한다.
그리고 여기서의 clear()가 아까 언급했던 ViewModel의 clear()메서드로 이어지는 것이다.