ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안드로이드 Activity 생명주기
    안드로이드 2020. 5. 28. 18:07
    반응형

      액티비티는 메모리에 들어가서 소멸하기까지 고유의 생명주기를 가지고 있습니다. 액티비티를 실행하거나, 종료하거나, 가려질 때 액티비티의 상태가 변화하며, 이때 각 상태에 맞게 생명주기 Callback이 실행됩니다.

      각 생명주기 사이클에 맞게 네트워크 작업의 중지 또는 재시작이나 애니메이션 재생, 사용 중인 자원의 해제 등과 같은 작업들을 적절히 수행해주어야 합니다. 그렇지 않으면 앱의 안정성, 성능 등이 떨어질 위험성이 있습니다. 아래는 구글 문서에서 설명하고 있는 생명주기 Callback을 잘 활용했을 시 해결할 수 있는 문제들입니다.

    • 앱을 사용하는 중간 다른 앱으로 전환할 때 (전화 등) 비정상 종료되는 문제

    • 앱을 활발히 사용하지 않을 경우 시스템 리소스의 낭비

    • 앱을 종료하지 않고 잠시 떠났다가 다시 돌아오는 경우 기존 진행 상태의 손실

    • 가로/세로 모드 전환 시 앱이 비정상 종료되거나 기존 진행 상태의 손실

       

    onCreate()

    State = Created

      액티비티 생성 시 딱 한 번만 실행되는 콜백 함수. 액티비티 전체 수명 주기 동안 한 번만 실행해야 하는 로직들을 이 콜백 메소드 내에서 수행해주면 됩니다. setContentView()를 통한 액티비티 뷰 그리는 작업, ViewModel과 연결 등의 로직을 작성하면 됩니다.

      이전 상태를 저장한 savedInstanceState라는 Bundle객체가 파라미터로 넘어오는데, 이전에 저장한 상태가 없다면 null이 떨어지고, 있다면 이 객체에서 getString() 등과 같은 메소드로 데이터를 꺼내올 수 있습니다. 시스템 메모리가 부족해져서 종료된 액티비티인 경우 이 번들 객체가 살아있으며, ViewModel는 이 경우에 살아있지 않습니다. 그러므로 유저가 직접 finish() 등으로 액티비티를 종료한 경우에는 onSaveInstanceState()가 호출되지 않아, 해당 번들 객체는 null로 넘어오게 됩니다.

    onStart()

    State = Started

      onCreate() 직후 실행되는 콜백이며 매우 빠르게 완료됩니다. 이 콜백이 호출되면 액티비티가 유저에게 보이게 되고, 앱은 액티비티를 포그라운드에 보내 상호작용할 수 있도록 준비합니다.

    onResume()

    State = Resumed

      이 콜백이 실행되면 액티비티가 포그라운드에 표시되고, 유저의 포커스가 떠날 때까지 액티비티가 이 상태를 계속 유지합니다.

    onPause()

    State = Paused

      유저의 포커스가 액티비티에서 떠날 때 처음으로 호출되는 콜백입니다. 액티비티가 완전히 보이지 않게 될 때까지 이 상태를 계속 유지합니다.

    • 홈버튼을 누르거나 다른 앱으로 이동할 때

    • 멀티 윈도우 환경에서도 (API 24 이상) 앱은 하나의 포커스만 가질 수 있기 때문에 다른 모든 앱은 모두 일시정지 상태가 됩니다.

    • 반투명/투명한 액티비티 또는 Dialog Theme인 액티비티가 올라오는 경우.
      (
      ※ 크기에 상관없이 Dialog가 뜨는 경우엔 호출 되지 않는다!!! ※)

     

      위 경우들에서 onPause가 호출됩니다. onResume과 짝이 되는 콜백으로, onResume에서 할당한 자원은 onPause에서 해제하는 것이 좋다고 합니다.

      또, 멀티 윈도우 상에서는 이 콜백이 호출되었어도 화면은 계속 보일 수 있기 때문에 UI 관련 리소스와 작업들을 완전히 해제하는 경우에는 onStop()을 사용하는 것이 좋습니다.

      onPause()는 아주 짧게 실행되므로 시간이 오래 걸리는 작업을 해서는 안됩니다. 예를 들어 네트워크 호출, 데이터베이스 트렌젝션 실행, 사용자 데이터 저장 등을 실행해서는 안됩니다. 이런 작업들이 끝나기도 전에 이 콜백이 종료될 수 있기 때문입니다.

      영구적인 데이터의 저장의 경우에는 여기서 저장하는 것이 좋습니다. 메모리 부족으로 액티비티가 종료되는 경우에는 onStop()이 호출되지 않을 수 있다고 합니다. (onPause는 반드시 호출!)

    이 상태에서 다시 이 액티비티로 포커스가 넘어오게 되면, 시스템은 onResume() 콜백을 실행하게 됩니다.

    onStop()

    State = Stopped

      액티비티가 완전히 가려져서 보이지 않게 되면 호출되는 콜백입니다.

      화면에 더 이상 보이지 않게 되었으니 필요하지 않은 시스템 리소스들을 모두 해제해줄 수 있습니다. 또한, 이 콜백에서 시간이 걸리는 작업을 수행하면 됩니다. 데이터베이스 트랜잭션 작업 등을 이곳에서 실행할 수 있습니다.

      이 상태에서 액티비티가 다시 시작되면 시스템은 onRestart()를 호출하고 onStart(), onResume()을 순서대로 호출합니다.

    메모리 부족인 경우에는 호출되지 않을 수 있습니다.

    onDestroy()

      액티비티가 소멸되기 전에 호출됩니다.

    • 유저가 finish()로 종료한 경우

    • 구성 변경 (configuration change) (가로/세로 모드 또는 멀티윈도우 모드)

      이 상태에서 ViewModel 객체 상태에 대해 잘 관리해야 합니다. 다시 액티비티가 생성되지 않을 경우 액티비티가 소멸하기 전에 ViewModel내의 데이터를 정리해야 합니다. 그렇지 않으면 다음 액티비티 인스턴스에 데이터가 그대로 전달되는 문제가 생길 수 있습니다.

      onStop()에서 해제하지 않았던 모든 리소스들을 이 상태에서 해제해야 합니다.

      onDestroy()을 호출하면 일반적으로 app이 메모리에서 사라집니다. 예외적으로 유저가 빈번하게 앱을 방문하는 경우, 빈번히 메모리에 로드하는 것을 방지하기 위해 시스템에서 onDestroy() 호출 후에도 메모리를 유지할 수 있습니다. 이를 "Empty Process"라고 부르며 프로세스는 죽었지만 메모리에 남아있을 수 있습니다.

    반응형

    댓글

Designed by Tistory.