Stargazer

[Android] 액티비티 생명주기 (Activity LifeCycle) 본문

프로그래밍/Android

[Android] 액티비티 생명주기 (Activity LifeCycle)

COM2IT 2021. 7. 6. 02:31
반응형

안드로이드의 액티비티는 생명주기라는 것을 가지고 있다.

 

생명주기(LifeCycle)이란?

액티비티가 시작하고 부터 끝날때까지의 루틴을 가리키는데, 액티비티의 상태 변화에 따른 콜백 메서드를 총칭한다.

쉽게 말하면 상태 변화를 알려주는 메서드다.

생명주기를 알아야 하는 이유:

액티비티 상태 변화에 따른 대응 및 문제 발생 예방을 해야하기 때문이다.

(ex. 사용자가 앱을 사용하는 도중에 전화가 걸려오거나 다른 앱으로 전환할 때 비정상 종료되는 문제)


생명주기

출처: 안드로이드 개발자 문서 (https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko)

 

총 7가지의 콜백으로 구성되어 있다

onCreate(), onStart(), onResume(), onPause(), onStop(), onRestart(), onDestory()

 

각 구성을 하나씩 살펴보자

메소드 설명 다음 메소드
onCreate() 액티비티가 생성될 때 호출되며 사용자 인터페이스 초기화에 사용됨. onStart()
onRestart() 액티비티가 멈췄다가 다시 시작되기 바로 전에 호출됨. onStart()
onStart() 액티비티가 사용자에게 보여지기 바로 직전에 호출됨. onResume() 또는 onStop()
onResume() 액티비티가 사용자와 상호작용하기 바로 전에 호출됨. onPause()
onPause() 다른 액티비티가 보여질 때 호출됨. 데이터 저장, 스레드 중지 등의 처리를 하기에 적당한 메소드. onResume() 또는 onStop()
onStop() 액티비티가 더이상 사용자에게 보여지지 않을 때 호출됨. 메모리가 부족할 경우에는 onStop() 메소드가 호출되지 않을 수도 있음. onRestart() 또는 onDestroy()
onDestroy() 액티비티가 소멸될 때 호출됨. finish() 메소드가 호출되거나 시스템이 메모리 확보를 위해 액티비티를 제거할 때 호출됨. 없음

출처: https://kairo96.gitbooks.io/android/content/ch2.4.1.html

 

메서드 호출하기

 

그러면 직접 앱을 실행해보면서 언제 해당 메소드가 실행되는지 직접 호출해보며 살펴 보겠다.

우선 새로 프로젝트를 만들어서 Empty 액티비티를 생성하면, MainActivity.kt이라는 파일이 java/com.example."프로젝트 명" 내에 존재 하게 된다.

아래 코드는 해당 메소드들을 재정의한 후 실행시 메시지를 보여주는 코드이다.

package com.example.second_week

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.PersistableBundle
import android.widget.Toast

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Toast.makeText(this,"onCreate", Toast.LENGTH_SHORT).show()
    }
    override fun onStart() {
        super.onStart()
        Toast.makeText(this,"onStart", Toast.LENGTH_SHORT).show()
    }
    override fun onResume() {
        super.onResume()
        Toast.makeText(this,"onResume", Toast.LENGTH_SHORT).show()
    }
    override fun onPause() {
        super.onPause()
        Toast.makeText(this,"onPause", Toast.LENGTH_SHORT).show()
    }
    override fun onStop() {
        super.onStop()
        Toast.makeText(this,"onStop", Toast.LENGTH_SHORT).show()
    }
    override fun onRestart() {
        super.onRestart()
        Toast.makeText(this,"onRestart", Toast.LENGTH_SHORT).show()
    }
}

 

앱이 처음 시작되었을때 액티비티 생성시 onCreate가 콜백 됨을 볼 수 있다.

 

그 후에 액티비티가 보여지기 직전에 호출(onStart)이지만 메세지 딜레이 때문에 늦게 표시됨..

 

실제 화면에 표출된 후에 상호작용을 하기 전에 onResume가 호출된다.

 

해당 화면을 벗어날시에 또는 다른 액티비티가 보이면 onPause가 호출

 

액티비티가 더 이상 안보일때 onStop을 호출(해당 화면은 보이긴 하지만 그런 의미가 아니라 액티비티가 비활성화 되어있음을 의미하는 듯 하다...)

 

다시 앱에 들어가면 onRestart가 실행된다.
Restart 이후에 onStart 메소드를 다시 호출해서 시작함을 알림

 

그 후에 화면이 보여진 후 ,상호작용 전에 onResume를 호출

 

그럼 앱을 종료해보자

다시 나오면 onPause가 호출되고 onStop이 호출된다.

 

액티비티가 소멸하기 직전에 onDestroy가 출력됨을 볼 수 있다.

 

액티비티 내 일반적인 호출 순서

액티비티 시작: onCreate() -> onStart() -> onResume()

액티비티 종료: onPause() -> onStop() -> onDestroy()

액티비티 재개: onPause() -> onStop() -> onRestart() -> onStart() -> onResume()

다이얼로그 실행 후 종료: onPause() -> onResume()

강제종료시 onCreate부터 호출

 

구체적인 활용 방안

onCreate: 액티비티 시작할때 가장 처음으로 시작하기 때문에, 액티비티 초기화 작업(화면 레이아웃 정의, 데이터 바인딩등 )이나 초기화면을 띄울때 사용

onStart: onCreate, onResume 사이이고, 화면이 노출되는 단계이므로 화면 진입할 때마다 처리 해야할 때 사용(광고배너 등)

onResume: 액티비티와 상호작용을 시작하는 단계이므로 상호작용에 필요한 기능을 불러올때 사용(임시저장 했던 입력폼 다시 불러오기 등)

onPause: 포커싱에서 벗어났을때 실행할 필요없는 기능들을 일시정지 할때(지도 뷰에서 현재 위치 gps 멈춤 등) 

onStop: 액티비티가 더 이상 보이지 않고, Pause에 비해 무거운 작업을 해줄때 사용(데이터 저장 등)

onRestart: 기능을 다시 시작했을때, 상태에 변경이 생기게 하고 싶을때(광고 다시 불러오기, 데이터 불러오기등 )

onDestroy: 액티비티를 종료 할 때 호출 되므로, 마무리 작업을 할때 사용(로그아웃, 데이터 저장 등)  

반응형
Comments