안드로이드 액티비티(Activity)에는 생명주기가 존재한다.
이에 따라 개발할때 고려해야 할 것들이 있는데, 우선 생명주기에 대해서 알아보자.
액티비티 생명주기는 onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestory()순으로 실행되며, 경우에 따라서 onRestart() 메소드가 호출되기도 한다.
공식문서에 따르면, 생명주기를 이해하고, 적절한 수명주기 콜백을 잘 구현하면 이러한 문제들을 해결하는데에 도움이 된다고 한다.
또한 앱의 완성도와 안정석을 높이기 위해서라도 반드시 알아야하는 개념이라고 한다.
- 사용자가 앱을 사용하는 도중에 전화가 걸려오거나 다른 앱으로 전환할 때 비정상 종료되는 문제
- 사용자가 앱을 활발하게 사용하지 않는 경우 귀중한 시스템 리소스가 소비되는 문제
- 사용자가 앱에서 나갔다가 나중에 돌아왔을 때 사용자의 진행 상태가 저장되지 않는 문제
- 화면이 가로 방향과 세로 방향 간에 회전할 경우, 비정상 종료되거나 사용자의 진행 상태가 저장되지 않는 문제
액티비티 생명주기 정리
OnCreate() (액티비티가 만들어질 때)
이 콜백은 시스템이 먼저 활동을 생성할 때 실행되는 것으로, 필수적으로 구현해야 한다.
활동이 생성되면 생성됨 상태가 된다. OnCreate() 메서드에서 활동의 전체 수명 주기 동안 한 번만 발생해야 하는 기본 애플리케이션 시작 로직을 실행한다.
- 필수적으로 구현해야한다.
- Activity의 생명주기 중 한 번만 발생해야하는 로직을 실행
- 멤버 변수 정의
- Ui 구성(setContentView, xml레이아웃 파일 정의)
- saveInstanceState 매개 변수 수신 -> Activity 이전 저장 상태가 포함된 Bundle 객체
OnStart() (화면에 보여지기 시작할때)
활동이 시작됨 상태에 들어가면 시스템은 이 콜백을 호출한다. OnStart()가 호출되면 활동이 사용자에게 표시되고, 앱은 활동을 포그라운드에 보내 상호작용을 할 수 있도록 준비한다. 예를 들어 이 메서드에서 앱이 UI를 관리하는 코드를 초기화한다.
- Activity가 사용자에게 표시
- 앱은 Activity를 포그라운드로 보내 상호작용할 수 있도록 준비
OnResume() (화면에 나타나 있고 실행중일때)
활동이 재개됨 상태에 들어가면 포그라운드에 표시되고 시스템이 OnResume() 콜백을 호출한다. 이 상태에 들어갔을때에 앱이 사용자와 상호작용한다. 어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때까지 앱이 이 상태에 머무릅니다. 예를 들어 앱 사용중에 전화가 오거나, 사용자가 다른 활동으로 이동하거나, 기기 화면이 꺼지는 이벤트가 이에 해당한다.
- Activity가 포그라운드에 표시되어, 사용자와 상호 작용 할 수 있는 상태
- 앱에서 포커스가 떠날 때까지 onResume 상태에 머무름
OnPause() (액티비티 화면의 일부가 다른 액티비티에 가려짐)
시스템은 사용자가 활동을 떠나는 것을 나타내는 첫 번째 신호로 이 메서드를 호출합니다.(하지만 해당 활동이 항상 소멸되는 것은 아님)
활동이 포그라운드에 있지 않게 되었다는 것을 나타냅니다.(다만 사용자가 멀티 윈도우 모드에 있을 경우에는 여전히 표시 될 수도 있음)
- 사용자가 활동을 떠나는 첫 번째 신호
- 매우 짧음
- 활동이 포그라운드에 있지 않지만, 잠시 후 다시 시작할 작업을 일시중지 하거나 조정
- 이 상태를 통해서, 실행중이지 않을 때 필요하지 않은 리소를 해지할 수 있음.
- 이 상태에서, 데이터를 저장하거나, 네트워크 호출, DB의 IO작업을 하면 안됨.
- 매우 짧은 시간이더라도 메서드가 끝나기 전에 Activity가 종료될 수 있음.
OnStop() (다른 액티비티의 실행으로 완전히 가려짐)
활동이 사용자에게 더 이상 표시되지 않으면 중단됨 상태에 들어가고, 시스템은 OnStop() 콜백을 호출합니다. 이는 예를 들어 새로 시작된 활동이 화면 전체를 차지할 경우에 적용됩니다. 시스템은 활동의 실행이 완료되어 종료될 시점에 OnStop()을 호출할 수도 있습니다.
OnStop() 메서드에서는 앱이 사용자에게 보이지 않는 동안 앱은 필요하지 않은 리소스를 해제하거나 조정해야 합니다. 예를 들어 앱은 애니메이션을 일시중지하거나, 세밀한 위치 업데이트에서 대략적인 위치 업데이트로 전환할 수 있습니다. OnPause() 대신 OnStop()을 사용하면 사용자가 멀티 윈도우 모드에서 활동을 보고 있더라도 UI 관련 작업이 계속 진행됩니다.
- Activity가 사용자에게 더 이상 표시 되지않은 상태
- CPU를 비교적 많이 소모하는 종료 작업을 실행해야함. ex) DB작업
- Activity가 중단되면, Android OS에서 리소스 관리를 위해, 해당 Activity가 포함된 프로세스를 소멸시킬 수 있음.
OnDestroy() (액티비티 종료됨)
onDestroy()는 활동이 소멸되기 전에 호출됩니다.
2가지의 경우가 있는데,
- (사용자가 활동을 완전히 닫거나 활동에서 finish()가 호출되어) 활동이 종료되는 경우
- 구성 변경(예: 기기 회전 또는 멀티 윈도우 모드)으로 인해 시스템이 일시적으로 활동을 소멸시키는 경우
예시 코드
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment
/**
* 1. Activity 가 실행, 종료 생명주기
* 2. 다른 앱 실행 시, 생명주기 (홈버튼)
* 3. 다른 Activity 실행 시, 생명주기
* */
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<Button>(R.id.button).setOnClickListener { navigateNextActivity() }
findViewById<Button>(R.id.button2).setOnClickListener { finish() }
Toast.makeText(this, "라이프사이클 - Main : onCreate", Toast.LENGTH_SHORT).show()
Log.d("라이프사이클 - Main", "onCreate")
}
override fun onStart() {
super.onStart()
Toast.makeText(this, "라이프사이클 - Main : onStart", Toast.LENGTH_SHORT).show()
Log.d("라이프사이클 - Main", "onStart")
}
override fun onRestart() {
super.onRestart()
Toast.makeText(this, "라이프사이클 - Main : onRestart", Toast.LENGTH_SHORT).show()
Log.d("라이프사이클 - Main", "onRestart")
}
override fun onResume() {
super.onResume()
Toast.makeText(this, "라이프사이클 - Main : onResume", Toast.LENGTH_SHORT).show()
Log.d("라이프사이클 - Main", "onResume")
}
override fun onPause() {
super.onPause()
Toast.makeText(this, "라이프사이클 - Main : onPause", Toast.LENGTH_SHORT).show()
Log.d("라이프사이클 - Main", "onPause")
}
override fun onStop() {
super.onStop()
Toast.makeText(this, "라이프사이클 - Main : onStop", Toast.LENGTH_SHORT).show()
Log.d("라이프사이클 - Main", "onStop")
}
override fun onDestroy() {
super.onDestroy()
Toast.makeText(this, "라이프사이클 - Main : onDestroy", Toast.LENGTH_SHORT).show()
Log.d("라이프사이클 - Main", "onDestroy")
}
private fun navigateNextActivity() {
val intent = Intent(this, NextActivity::class.java)
startActivity(intent)
}
}
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
class NextActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_next)
Toast.makeText(this, "라이프사이클 - Next : onCreate", Toast.LENGTH_SHORT).show()
Log.d("라이프사이클 - Next", "onCreate")
}
override fun onStart() {
super.onStart()
Toast.makeText(this, "라이프사이클 - Next : onStart", Toast.LENGTH_SHORT).show()
Log.d("라이프사이클 - Next", "onStart")
}
override fun onRestart() {
super.onRestart()
Toast.makeText(this, "라이프사이클 - Next : onRestart", Toast.LENGTH_SHORT).show()
Log.d("라이프사이클 - Next", "onRestart")
}
override fun onResume() {
super.onResume()
Toast.makeText(this, "라이프사이클 - Next : onResume", Toast.LENGTH_SHORT).show()
Log.d("라이프사이클 - Next", "onResume")
}
override fun onPause() {
super.onPause()
Toast.makeText(this, "라이프사이클 - Next : onPause", Toast.LENGTH_SHORT).show()
Log.d("라이프사이클 - Next", "onPause")
}
override fun onStop() {
super.onStop()
Toast.makeText(this, "라이프사이클 - Next : onStop", Toast.LENGTH_SHORT).show()
Log.d("라이프사이클 - Next", "onStop")
}
override fun onDestroy() {
super.onDestroy()
Toast.makeText(this, "라이프사이클 - Next : onDestroy", Toast.LENGTH_SHORT).show()
Log.d("라이프사이클 - Next", "onDestroy")
}
}
표로 정리
메소드 | 설명 | 다음 메소드 |
onCreate() | 액티비티가 생성될 때 호출되며 사용자 인터페이스 초기화에 사용됨. | onStart() |
onRestart() | 액티비티가 멈췄다가 다시 시작되기 바로 전에 호출됨. | onStart() |
onStart() | 액티비티가 사용자에게 보여지기 바로 직전에 호출됨. | onResume() 또는 onStop() |
onResume() | 액티비티가 사용자와 상호작용하기 바로 전에 호출됨. | onPause() |
onPause() | 다른 액티비티가 보여질 때 호출됨. 데이터 저장, 스레드 중지 등의 처리를 하기에 적당한 메소드. | onResume() 또는 onStop() |
onStop() | 액티비티가 더이상 사용자에게 보여지지 않을 때 호출됨. 메모리가 부족할 경우에는 onStop() 메소드가 호출되지 않을 수도 있음. | onRestart() 또는 onDestroy() |
onDestroy() | 액티비티가 소멸될 때 호출됨. finish() 메소드가 호출되거나 시스템이 메모리 확보를 위해 액티비티를 제거할 때 호출됨. | 없음 |
출처 :
https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko
안드로이드 개발자 공식문서를 통해 정리하였습니다.
https://bbaktaeho-95.tistory.com/62
다른 분들의 블로그 또한 참고하였습니다.
'Android > Study' 카테고리의 다른 글
[Android] 로그인 기능 구현 (2) - UiState (0) | 2024.01.14 |
---|---|
[Android] View가 그려지는 순서 (0) | 2024.01.13 |
[Android] 안드로이드 4대 컴포넌트 (0) | 2024.01.13 |
[Android] 졸업 프로젝트 개요 (0) | 2024.01.07 |
[Android] RelativeLayout(상대적 레이아웃) 정리 (0) | 2023.12.23 |