[Android-studio] Activity lifecycle

델버·2022년 5월 26일
0

Android

목록 보기
1/5

Activity Lifecycle(액티비티 생명주기)

  • 만약 사용자가 다른 앱을 실행하려고 하거나 다른 앱으로부터 알림(카톡)이 올 때 안드로이드는 어떻게 처리될까에 대해 알 수 있는 개념이다.
  • 사용자가 앱을 전환하거나 나갔다가 다시 들어오는 행위를 할 때 Activity lifecycle 안에서 변화한다. 만약 이렇지 않을 경우 비정상적인 종료가 일어나거나 효율적이지 못한 메모리가 쌓일 것이다. 앞으로는 사용하지 않을 액티비티를 계속하여 켜두게 되면 그 메모리는 비효율적일 것이다.
    우리가 다른 앱을 켜뒀다가 다시 돌아갈 때 이전 상태를 보여주는 것은 이 activity lifecycle에 따라서 그렇다.
  • 그렇기 때문에 이 activity lifecycle을 이해하고 구현하는 것이 중요하다.

lifecycle callback

  • Lifecycle에서 진행되는 callback 함수는 총 6가지이다.

1. onCreate()

  • 시스템이 처음 액티비티를 생성할 때 실행된다. 이 함수는 activity lifecycle에서 한 번만 발생해야하는 기본 로직들을 실행한다. 그렇기 때문에 항상 override하여 구현해야한다!
  • 이전 활동의 상태의 값을 불러오거나 XML 레이아웃 파일을 전달해주거나(setContentView()), UI구성 등 activity의 기본 설정을 한다.
  • onCreate()가 되면 created 상태가 되고 활동이 완료가 되면 started 상태가 되면서 onStart()onResume()을 호출한다.

2. onStart()

  • 앞선 onCreate()가 완료되어 started 상태가 되면 실행되는 callback이다.
    (또는 onRestart() 다음에 실행된다.)
  • 이 함수가 호출되면 activity가 사용자에게 보여진다.
  • 아직 사용자와 상호작용을 하지는 않고 foreground라는 곳에서 상호작용을 준비한다.
  • override할 경우 superclass implementation를 호출해야한다.
  • 활동이 완료되면 resumed 상태가 되며 onResume()이 호출된다.

3. onResume()

  • resumed 상태가 되면 foreground가 표시되어 실행되는 callback이다.
  • resumed 상태일 때 사용자와 앱이 상호작용을 한다.
  • 만약 이 상호작용을 방해하는 이벤트(알림, 다른 앱 전환, 전화)가 발생 되면 paused 상태가 되고 onPause()가 호출된다. 그리고 사용자가 다시 activity로 돌아오면 onResume()이 다시 호출된다.

4. onPause()

  • paused 상태가 되면 실행되는 callback이다. 사용자가 activity를 떠나거나 activity가 소멸될 때 호출된다. activity가 foreground에 있지 않다는 것을 말한다.
  • activity를 일시중지하여 foreground 벗어났을 때 실행할 필요 없는 기능을 모두 정지할 수 있다.
  • onPause()는 빠른 시간에 실행된다. 실행하다가 중단될 수 있으므로 데이터를 저장하거나 네트워크 호출 등을 실행하면 안 된다. 그런 것들은 onStop()에서 하는 것이 더 좋다.
    이에 대한 공홈의 설명
    https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko#saras
  • 이 함수가 완료된다고 해도 activity는 paused 상태에 머물게 된다. 그러다가 아예 activity가 없어지면 onStop() 을 호출하게 된다.

5. onStop()

  • activity가 더이상 사용자에게 표시되지 않으면 Stopped 상태가 되며 onStop()이 실행된다. 새로운 activity가 화면 전체를 가릴 때 기존 activity가 이 상태에 들어가는 것이다.
  • 이때는 앞서 onPause()에서 하지 말아야할 것들을 한다. 예를 들어 사용자에게 보이지 않는 상태이므로 애니메이션 중지나 위치 업데이트 등의 리소스를 해제하거나 조정한다.
  • onStop()에서는 CPU를 비교적 많이 소모하는 종료 작업을 실행해야 한다. 예를 들어 데이터베이스에 데이터를 저장할 때이다.
  • 다시 사용자와 상호작용을 할 때면 onRestart()를 호출하고, activity가 종료되면 onDestroy()를 호출한다.

6. onDestroy()

  • onDestroy()는 activity 소멸 전에 호출된다. 예를 들어 아예 activity가 종료되거나 finish()가 호출되거나, 시스템에서 일시적으로 activity가 소멸되는 경우에 호출된다.
  • 만약 구성 변경(configuration change)으로 인해 호출되면 시스템이 즉시 새 activity instance를 생성한 다음, 새로운 구성에서 새 instance에 관해 onCreate()를 호출한다. (ex 화면전환)
  • 안드로이드 공홈에서는 onDestroy()를 설명하면서 ViewModel을 언급한다. 화면 전환을 하게 되면 onDestroy()되면서 다시 화면이 만들어지고 새로운 instance가 onCreate()된다. 이때 이전 데이터 값을 어떻게 새 activity에게 넘겨주는가가 문제인데, ViewModel이 해결법이다.
    ViewModel로 파괴될 activity의 데이터가 유지되는데 이때 (onCreate()의 parameter로 볼 수 있는) Bundle 클래스에 담긴 saveInstanceState로 전달한다는 것이다.
  • ViewModel의 lifecycle은 activity와 달라서 데이터가 유지되는데, 만약 activity가 완전히 소멸되면(더이상 activity가 생성되지 않으면 ) onCleared()를 호출한다.


참고

0개의 댓글