Study Record

[안드로이드] Activity 라이프사이클(lifeCycle) 살펴보기 본문

안드로이드

[안드로이드] Activity 라이프사이클(lifeCycle) 살펴보기

초코초코초코 2023. 6. 29. 00:28
728x90

 

 

android 개발자 문서에서 가져온 생명 주기 그림

 

 

 

Activity 의 생명 주기에 따라 onCreate(), onStart(), onResume(), onPause(), onStop(), onDestory(), onRestart() 로 나뉜다. 앱이 시작하면 onCreate() > onStart() > onResume() 가 호출되고, 앱을 종료하면 onPause() > onStop() > onDestory() 가 호출된다.

 

 

onCreate()

Activity 객체가 메모리에 새롭게 생성된 후 호출되며 click listener 와 data binding 셋팅 layout inflate 작업 등을 실행한다. Activity 객체가 새로 생성될 때 1번 불린다. (Activity 가 생성됨 상태에 들어간다.)

 

 

onStart()

Activity 가 화면에 보이기 시작한다. 1번만 불리는 onCreate() 와 달리 Activity 의 생명 주기 내에서 여러 번 불릴 수 있다. 

(onCreate() 실행 후 시작됨 상태가 되고 onStart() 실행 후 재개됨 상태에 들어간다.)

 

 

 

onResume()

Activity 에 포커스가 주어지고 사용자와 상호작용할 준비가 되어있는 상태이다. 어떤 이벤트가 발생하여 포서스가 떠날 때까지 앱이 재개됨 상태로 머무른다. 어떤 이벤트로는 전화가 오거나, 다른 활동으로 이동하거나, 기기 화면이 꺼지는 이벤트 등이 있다.

 

 

 

onPause()

Activity 에서 포커스를 잃었을 때 호출된다. 사용자가 Activity 를 떠난다는 첫 번째 신호이다. 시스템 리소스, 센서 핸들 또는 활동이 일시중지 중이고 사용하자 필요로 하지 않을 때 배터리 수명에 영향을 미칠 수 있는 모든 리소스를 해체해야 한다. 멀티 윈도우 모드를 지원해야 한다면 onStop() 을 사용하는 것이 좋다. (Activity 가 일시중지됨 상태에 들어간다.)

 

onPause() 는 아주 잠깐 실행되므로 저장 작업을 실행하기에는 시간이 부족하기 때문에 네트워크 호출, 데이터베이스 트랜잭션을 실행하면 안 된다. 부하가 큰 작업은 onStop() 를 사용해야 한다.

 

 

 

onStop()

Activity 의 화면이 더 이상 보이지 않을 때 호출된다. 앱이 필요하지 않은 리소스를 해제하거나 CPU 를 비교적 많이 소모하는 종료 작업을 실행한다.  (Activity 가 중단됨 상태에 들어간다.)

 

Activity 가 중단됨 상태에 들어가면 Activity 객체는 메모리 안에 머무르게 된다. 모든 상태 및 멤버 정보를 관리하고 레이아웃의 각 View 객체의 현재 상태도 기록하고 Activity 가 다시 재개되면 저장한 정보를 호출한다.

 

 

 

onDestory()

Activity 가 완전히 종료될 때 호출되며 가비지 컬렉션(Garbage-collected)이 가능하다. 생명 주기동안 1번만 호출된다.

 

 

 

onRestart()

Activity 가 다시 시작될 때 호출된다.(background > foreground 로 전환될 때) oncreate() 와 같이 Activity 가 화면에 보이기 전에 호출된다.

 

+ 가비지 컬렉션(Garbage-collected)은 더 이상 사용하지 않은 개체를 자동으로 정리하는 시스템이다. onDestory() 가 호출되면 OS 가 해당 객체를 메모리에서 정리하기 시작한다.

 

 

 

😶 Activity 의 여러 가지 상태 변화 시나리오

Activity 가 완전히 종료되지 않았지만, 중간에 전화가 오거나 다른 앱으로 잠깐 이동하는 경우 Activity 가 포커스를 잃고 백그라운드에 남아있는 경우가 있다. 이럴 경우 완전히 Activity 가 종료되지 않았기 때문에(onDestory() 호출하지 않음) 다시 돌아왔을 때 새로운 Activity 객체가 생성되거나 하지는 않는다.

 

다만, 다른 앱으로 이동했을 때 화면이 완전히 보이지 않게 되면 onPause() > onStop() 호출된다. 다시 사용자가 돌아오면 onRestart() > onStart() > onResume() 가 불리면서 사용자와 상호작용할 수 있는 상태가 된다.

 

 

 

😶 onPause() 와 onStop() - focus 와 visible

onPause() 는 포커스를 잃었을 때, onStop() 는 화면이 더이상 보이지 않을 때 호출된다. 이 둘의 차이점은 포커스를 읽은 상태일 때는 사용자에게 화면이 보이는 상황이라는 것이다. 

 

예시) onPause() 만 호출된 경우

다른 프로그램의 일부가 화면을 가릴 경우 Focus 를 읽는다. 일부만 화면을 가렸기 때문에 onStop() 은 노출되지 않는다. 다시 화면으로 돌아오면 onResume() 만 다시 호출된다.

 

 

 

 

- onPause() > onResume() : Dialog 호출 시, 일부 화면만 가여지는 경우 등

- onPause() > onStop() > onRestart() > onStart() > onResume() : 홈 버튼을 누르거나 전화가 왔을 때 등

 

 

 

😶 Activity 가 소멸되는 시나리오

 

사용자가 뒤로 버튼을 누르거나 finish() 메서드를 호출하여 자체적인 소멸 신호를 보내는 경우

Activity 인스턴스에 관한 시스템과 사용자의 콘셉트가 모두 영구적으로 사라진다.

 

 

시스템 제약(메모리 부족, 구성 변경) 으로 인해 활동을 소멸시킬 경우

Activity 인스턴스는 사라지지만 시스템에 존재했다는 정보가 남아 사용자가 다시 활동으로 돌아가려고 하면 소멸 당시 활동의 상태를 설명하는 저장된 데이터 세트를 활용하여 새로운 인스턴스를 생성한다. 이때 시스템이 이전 상태를 복원하기 위해 저장한 데이터를 "인스턴스 상태 Bundle" 객체에 저장하고 재생성 되면 자동으로 복구되지만 극소량 이상의 데이터를 보존하려면 영구 로컬 저장소, onSaveInstanceState() , ViewModel 클래스를 이용하여 복합적인 방법을 사용해야 한다.

 

 

 

😶 UI 상태 저장과 복원 - onSaveInstanceState() , onRestoreInstanceState()

Activity 가 정지되기 시작하면 인스턴스 상태 Bundle 에 상태를 저장할 수 있도록 onSaveInstanceState() 메소드를 호출한다. 

override fun onSaveInstanceState(outState: Bundle?) {
    // Save the user's current game state
    outState?.run {
        putInt("STATE_SCORE", currentScore)
        putInt("STATE_LEVEL", currentLevel)
    }

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(outState)
}

 

 

Activity 가 소멸된 후 재생성 될경우, onCreate() 및 onRestoreInstanceState() 콜백 메서드 둘 다 인스턴스 상태 정보를 포함한 동일한 Bundle 객체를 수신한다. onRestoreInstanceState() 는 onStart() 메서드가 실행된 이후에 불린다.

 

onCreate() 는 새롭게 Activity 생성할 때뿐만 아니라 이전 인스턴스를 재생성할 때 불릴 수 있기 때문에 Bundle 객체가 null 인지 확인하는 작업이 필요하다.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState) // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        with(savedInstanceState) {
            // Restore value of members from saved state
            currentScore = getInt(STATE_SCORE)
            currentLevel = getInt(STATE_LEVEL)
        }
    } else {
        // Probably initialize members with default values for a new instance
    }
}

 

onRestoreInstanceState() 는 시스템 복원할 저장 상태가 있을 경우에 호출하기 때문에 Bundle 이 null 인지 확인하지 않아도 된다.

override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState)

    // Restore state members from saved instance
    savedInstanceState?.run {
        currentScore = getInt(STATE_SCORE)
        currentLevel = getInt(STATE_LEVEL)
    }
}

 

 

+ 강제 종료 시나리오 테스트

https://laustudy.tistory.com/342

 

 

 

활동 수명 주기에 관한 이해  |  Android 개발자  |  Android Developers

활동은 사용자가 전화 걸기, 사진 찍기, 이메일 보내기 또는 지도 보기와 같은 작업을 하기 위해 상호작용할 수 있는 화면을 제공하는 애플리케이션 구성요소입니다. 각 활동에는 사용자 인터페

developer.android.com

 

728x90