불순분자 Kotlin [9] - Android 생명주기

불순분자들·2022년 7월 18일
0

List App 만들기

목록 보기
9/18

이번에는 kotlin과 함께 안드로이드 생명주기에 대해서 알아볼 것이다.

Android Activity LifeCycle

  • Activity는 안드로이드 4대 컴포넌트 중 하나로 UI와 밀접한 관련을 갖는다.
  • 많은 앱은 하나 이상의 액티비티가 서로 연결된 형태로 구성된다.

활동 수명 주기에 관한 이해

안드로이드에서는 사용자와 앱 사이의 어떠한 이벤트의 발생에 대한 기본적인 처리방법을 제공해준다.
우리는 앱을 사용하면서 많은 이벤트를 발생시키고 있는데 그 상황에 대해서 잠깐 생각해보자

  • 앱을 사용하는 도중 전화가 걸려오거나 홈으로 나간 경우.
  • 앱을 사용했으나 프로세스를 종료하지 않은 경우.
  • 앱에서 나갔다가 다시 들어왔을 때, 진행 상태가 저장되지 않는 문제
  • 화면이 회전할 때나 비정상 종료될 경우.

위와 같이 어떠한 상황에 따른 처리방법을 우리는 코드를 작성해 해결해주어야 할 의무가 있다.
그러므로 우리는 기본적으로 Android Life Cycle에 대해 공부해야한다.

활동 수명 주기 개념

활동 수명 주기 단계 간에 전환하기 위해 활동 클래스는 6가지 콜백으로 구성된 핵심 집합의 onCreate(), onStart(), onPause(), onStop(), onDestroy()를 제공한다.

위 그림은 공식문서에 나와있는 Activity Life Cycle에 대해 표현한 그림이다.
나와 비슷한 사람들은 이것을 보고 아무생각도 들지 않을것이다. 난 진짜 아무 생각도 안들었다,,,
그래서 내가 간단한 코드로 설명해보려고 한다.

활동 수명 주기 콜백

onCreate()

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // onCreate는 액티비티가 생성될 때 호출되며 사용자 인터페이스 초기화 할 때 이 곳에 구현.
        println("onCreate !!!")
    }

onCreate()는 액티비티가 생성, 실행될 때 호출이 되며, 사용자 인터페이스를 초기화 할 때 이 곳에 구현한다.
println()을 찍어보면 앱을 실행했을 경우 찍히게 된다.

  • onCreate()의 경우, 생성된 상태에 머무르지 않고, 메서드가 실행을 완료하면 시작됨 상태가 되고, 시스템이 연달아 onStart()와 onResume() 메서드를 호출한다.

onStart()

override fun onStart() {
        super.onStart()
        // 액티비티가 사용자에게 보여지기 직전에 호출 됨.
        println("onStart !!!")
    }

활동이 시작됨 상태에 들어가면 시스템은 onStart()를 호출한다.
onStart()가 호출되면 활동이 사용자에게 표시되고, 앱은 활동을 포그라운드에 보내 상호작용할 수 있도록 준비한다.

  • onStart() 메서드는 매우 빠르게 완료되며, 생성됨 상태와 마찬가지로 활동은 시작됨 상태에 머무르지 않는다.
  • onStart()가 완료되면, 활동이 재개됨 상태에 들어가고, onResume() 메서드를 호출한다.

onResume()

override fun onResume() {
      super.onResume()
      // 액티비티가 사용자랑 상호작용 하기 직전에 호출 됨. ( 시작 or 재개 상태 )
      println("onResume !!!")
  }

이 상태에 들어갔을 때, 앱이 사용자와 상호작용한다.
어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때까지 앱이 이 상태에 머무르게 된다.
ex) 전화가 오거나, 다른 활동으로의 이동, 기기 화면이 꺼짐.

  • 활동이 재개됨( onResume ) 상태로 전환되면 이 활동의 수명 주기와 연결된 모든 수명 주기 인식 구성요소는 ON_RESUME 이벤트를 수신하게된다.
  • 방해되는 이벤트가 발생하면 활동은 일시중지됨 상태에 들어가고, 시스템이 onPause() 콜백을 호출한다.

onPause()

override fun onPause() {
      super.onPause()
      // 다른 액티비티가 보여지게 될 떄 호출됨. ( 중지 상태 )
      println("onPause !!!")
  }

시스템은 사용자가 활동을 떠나는 것을 나타내는 첫 번째 신호로 이 메서드를 호출하게 된다.

  • onPause()는 아주 잠깐 실행되므로 저장 작업을 실행하기에는 시간이 부족하다. 그러므로 onPause()를 사용하여 저장 작업을 하는 것은 권장하지 않는다.
  • 만약, 부하가 큰( 저장 등 ) 종료 작업은 onStop() 상태에서 하면 된다.

onPause() 는 활동이 다시 시작되거나 사용자에게 완전히 보이지 않을 때까지 이 상태에 머무르게 된다.
활동이 다시 시작되면 시스템은 onResume() 메서드를 호출한다.

onStop()

override fun onStop() {
      super.onStop()
      // 액티비티가 사용자에게 완전히 보여지지 않을 때 호출됨.
      println("onStop !!!")
  }

활동이 사용자에게 더 이상 표시되지 않으면 중단됨 상태에 들어가고, 시스템은 onStop()을 호출하게 된다.

  • onPause() 대신 onStop() 을 사용하게 되면 사용자가 멀티 윈도우 모드에서 활동을 보고 있더라도 UI 관련 작업이 계속 진행된다.
  • 또한, onStop()을 통해 CPU를 많이 소모하는 종룍 작업을 실행해야하며, 데이터베이스에 저장할 적절한 시기를 찾지 못했다면 onStop() 상태일 때 저장할 수 있다.

onDestroy()

override fun onDestroy() {
      super.onDestroy()
      // 액티비티가 소멸( 제거 )될 때 호출됨.
      println("onDestroy !!!")
  }

onDestroy() 는 활동이 소멸되기 전에 호출되며, finish() 메서드가 호출된 경우, 구성 변경으로 인해 시스템이 일시적 활동을 소멸시키는 경우에 발생하게 된다.

추가1. onRestart()

override fun onRestart() {
      super.onRestart()
      // 액티비티가 멈추었다가 다시 시작 될 때 호출됨.
      println("onRestart !!!")
  }

위 경우는 액티비티가 멈추었다가 다시 시작 될 때 호출되는데, 이것은 공식문서에 나와있지 않으므로 이런게 있다. 라고 알아두면 좋을 것 같다.

추가2. Activity 상태 및 메모리에서 제거


위 그림은 프로세스 상태에 따른 액티비티의 상태를 보여주며 그에 따른 종료될 가능성에 대한 상관관계를 보여준다.
나중에 에러가 났을 경우, 위 그림을 통해서 생명주기에 대한 에러를 처리할 수 있을 것 같아서 올린다.

profile
장래희망 : 침대 위 녹아든 치즈

0개의 댓글