[Android] 생명주기

정상준·2023년 1월 25일
0
post-thumbnail

📚 생명주기

모든 활동에는 수명 주기가 있습니다. 이는 마치 사람이 태어나서 죽는 것과 비슷하다고 볼 수 있습니다.
마찬가지로 활동 수명 주기도 활동이 처음 초기화될 때부터 소멸(이때 운영체제(OS)에서 메모리를 회수함)될 때까지 활동이 거쳐가는 여러 상태로 구성됩니다.

다음 다이어그램은 모든 활동 수명 주기 상태를 보여줍니다. 앱의 생명주기는 사람과 달리 단방향이 아닌 양방향입니다.

활동 수명 주기 상태가 변경될 때, 일부 동작을 변경하거나 코드를 실행하려고 할 때가 많습니다.
Android에서는 활동이 한 상태에서 다른 상태로 이동할 때 이러한 콜백을 호출하고 개발자는 이러한 메서드를 자체 활동에서 재정의하여 수명 주기 상태 변경에 응답해 작업을 실행할 수 있습니다. 다음 다이어그램은 사용할 수 있는 재정의 가능한 콜백과 함께 수명 주기 상태를 보여줍니다.

❗️참고: onRestart() 메서드의 별표는 Created와 Started 간에 상태가 전환될 때마다 이 메서드가 호출되지는 않음을 나타냅니다. onStop()이 호출되고 이후에 활동이 다시 시작되는 경우에만 호출됩니다.

✏️ 생명주기 단계별 메소드

  • onCreate(): 시스템이 앱을 생성할 때 호출됩니다.
  • onStart(): 앱이 화면에 표시되도록 하지만 사용자는 아직 앱과 상호작용할 수 없습니다.
  • onResume(): 앱을 포그라운드로 가져오고 사용자는 이제 앱과 상호작용할 수 있습니다.
  • onPause()가 호출되면 앱에 더 이상 포커스가 없습니다.
  • onStop() 이후에는 앱이 더 이상 화면에 표시되지 않습니다
  • onDestroy()는 onStop() 후에 호출됩니다. 활동이 소멸되기 직전에 호출됩니다. 이는 앱의 코드에서 finish()를 호출하거나, 구성 변경으로 인해 시스템에서 활동을 소멸하고 다시 만들어야 할 때 발생할 수 있습니다

❗️ 참고: onRestart()는 활동이 이미 만들어진 후 onStop()이 호출될 때 최종적으로 Created 상태로 전환되지만 Destroyed 상태로 들어가는 대신 Started 상태로 다시 돌아가는 경우에만 시스템에서 호출합니다. onRestart() 메서드는 활동이 처음으로 시작되지 않은 경우에만 호출하려는 코드를 배치하는 위치입니다.

✏️ 앱 소멸

코드에서 활동의 finish() 메서드를 수동으로 호출하거나 사용자가 앱을 강제 종료하면 Android OS에서는 활동을 닫을 수 있습니다. 예를 들어 사용자는 최근 화면에서 앱을 강제 종료하거나 닫을 수 있습니다. OS는 또한 앱이 장시간 화면에 표시되지 않으면 자체적으로 활동을 종료할 수 있습니다. 이를 통해 Android는 배터리 수명을 보존하고 다른 앱이 앱의 리소스를 사용할 수 있도록 합니다.

활동은 사용자가 활동에서 벗어날 때마다 완전히 닫히지 않습니다.

  • 활동이 화면에 더 이상 표시되지 않으면 이 상태는 활동이 백그라운드에 배치되는 것입니다. 이와 반대의 경우는 활동이 포그라운드에 있거나 화면에 표시되는 것입니다.
  • 사용자가 앱으로 돌아오면 동일한 활동이 다시 시작되어 화면에 다시 표시됩니다. 수명 주기에서 이 부분을 앱의 표시 수명 주기라고 합니다.

✏️ 구성변경

구성 변경은 기기 상태가 매우 급격하게 변경되어 시스템이 변경사항을 확인하는 가장 쉬운 방법이 활동을 완전히 종료하고 다시 빌드하는 것일 때 발생합니다. 즉 앱의 생명주기를 Destroy 시켰다가 새로 Create해주는 것이다.
여기서 만약 State를 remember로 기억한다면 리컴포지션 할 땐 기억을 하지만 구성변경이 될 때엔 기억하지 못해 초기화 됩니다. remember로 state를 저장하지 않고 리컴포지션이 된다면 값이 초기화 되는 것이랑 비슷합니다. 때문에 구성변경이 되어도 상태를 유지하기 위해선 rememberSaveable 를 사용해야 합니다.
즉 리컴포지션 중에 값을 저장하려면 remember를 사용해야 합니다. rememberSaveable을 사용하여 리컴포지션 및 구성 변경 중에 값을 저장합니다.

profile
안드로이드개발자

0개의 댓글