안드로이드 생명주기는 안드로이드 개발에 필수적인 지식이며, 꼭 필요한 내용이라고 생각합니다.
생명주기에는 3개의 생명주기(Activity, Fragment, Service)가 있지만 이번 글에서는
Activity life cycle
에 대해서 다룰 예정입니다.
안드로이드 개발 면접에서도 자주 나오는 주제고, 저도 그랬지만, 대충 알고 넘겼었는데, 이번 글로 확실하게
개념을 잡아볼까 합니다.
📕생명주기(Life Cycle)
Activity가 생성, 정지, 재생, 종료 등 여러 상태 간의 전환을 위해 6가지 콜백으로 구성된 핵심세트를 제공합니다.
Activty 간 새로운 상태에 들어가면 시스템은 각 콜백을 호출한다.
📗콜백(callback)
A가 어떤 특정한 동탁을 한다면 A가 B에게 알려 주는 것을 의미합니다.
📗Activty의 생명 주기가 필요한 이유?
사용자가 어떤 Activity를 사용하는 중, 다른 이벤트가 발생할 경우(ex - 카카오톡 실행 중, 전화가 오는 경우)
사용 중이던 카카오톡의 일시 정지가 필요하고, 종료가 필요한 순간이 있습니다.
그때 Activity의 Life Cycle을 사용하면 적시에 알맞은 작업을 하고 적절하게 전환하여 App이 더욱 안정적으로 기능할 수 있게 기여합니다.
💡생명주기는 다음과 같은 문제를 예방하는데 도움이 됩니다.
- 사용자가 앱을 사용하는 도중에 전화가 걸려오거나 다른 앱으로 전환할 때 비정상 종료되는 문제
- 사용자가 앱을 활발하게 사용하지 않는 경우 귀중한 시스템 리소스가 소비되는 문제
- 사용자가 앱에서 나갔다가 나중에 돌아왔을 때 사용자의 진행 상태가 저장되지 않는 문제 (정말 끔찍한 상황임.)
- 화면이 가로 방향과 세로 방향 간에 회전할 경우, 비정상 종료되거나 사용자의 진행 상태가 저장되지 않는 문제
📕전체적인 흐름
🔎예시를 들어서 설명해 드리겠습니다.
- 각 번호에 해당하는 상황에 대한 설명이라고 생각하면 편합니다.
- 현재 상황은 제가 카톡을 하고 있을 때 전화가 오는 상황입니다.
- 카카오톡에 해당하는 액티비티가 onPause() 메서드를 실행합니다.
- 여기서 만약 전화 수신을 취소한다면 다시 카카오톡 액티비티로 돌아가야 합니다.
- 만약 제가 전화를 받았다면 카카오톡에 액티비티는 화면상에 완전히 없어지므로,
onStop() 메서드가 실행될 겁니다. - 제가 전화를 받고 이제 통화를 종료하면, 다시 카카오톡으로 돌아가야 합니다.
그때 실행되는 메서드가 onRestart()입니다. - 액티비티가 종료되거나, 시스템에서 강제 종료가 된다면 onDestory() 메서드로 진입합니다.
- 이러한 예시를 보면 아래 각 메서드들이 어떤 활동을 하는지, 어떤 순서로 호출되는지를 쉽게 이해하실 수 있을 겁니다.(아마도요ㅎㅎ,,)
💻onCreate()
최초로 Activity가 생성될 때 실행되는 메서드로 activity가 만들어질 때 단 한 번만 호출됩니다.
구현 시 활동의 필수 구성요소를 초기화해야 합니다.
예를 들어서 앱이 여기에서 뷰를 생성하고, 데이터를 목록에 결합해야 합니다.
[데이터바인딩, 뷰 바인딩, 이전 상태 데이터 복구(savedInstanceState 등) ]
이 단계에서 setContentView()를 호출해서 activity의 사용자 인터페이스르 위한 레이아웃을 정의해야 하며
이 단계가 가장 중요합니다.
onCreate() 단계가 완료되면 onStart()를 호출하게 됩니다.
💻onStart()
onCreate()가 종료되면 activity는 onStart() 상태로 전환되고, activity가 사용자에게 표시됩니다.
액티비티가 화면에 보이기 바로 전에 호출됩니다. [화면상에 액티비티가 보이면 onResume()이 호출됩니다.]
화면에 진입할 때마다 실행되어야 하는 작업을 이 단계에서 구현합니다.
onCreate()와 차이점이라면 onCreate()는 Activity가 실행될 때 딱 한 번만 처리되고, onStart()는 onStop이 실행된
이후 다시 진행할 작업에 중점을 줍니다.
💻onResume()
액티비티가 화면에 보이는 직후에 호출됩니다.
이 시점에서의 액티비티는 액티비티 스택의 맨 위에 있으며, 모든 사용자 입력을 캡처합니다.
앱의 핵심 기능은 대부분 onResume() 메서드로 구현됩니다.
onPause() 콜백은 항상 onResume() 뒤에 호출됩니다.
💻onPause()
액티비티가 어떤 이벤트가 발생하여 화면의 일부가 가려졌을 때 호출됩니다.
여기서 발생하는 이벤트의 예는 뒤로 가기 버튼, 최근 버튼 탭, 다른 액티비티 호출 등이 있습니다.
현재 액티비티는 일시 중지 상태가 됩니다.
onPause() 메서드는 다른 액티비티가 호출되기 전에 아주 잠깐 실행되기 때문에
이 작업은 매우 빨리 수행되어야 하기에 무거운 작업을 해서는 안됩니다.
ex) 데이터 저장, 네트워크 호출 등
💻onStop()
화면 전부가 보이지 않을 때 호출이 되며 onPause() 메서드와 다른 점은
화면이 일부 가리면 onPause(), 화면이 완전히 가려지면 onStop()이다.
액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있으며,
이 단계에서 액티비티를 호출하면 onRestart() 메서드가 호출됩니다.
💻onRestart()
onStop()이 호출된 이후에 다시 기존 Activity로 돌아가는 경우에 호출되는 메서드
액티비티가 stop 된 시간부터 액티비티 상태를 복원합니다.
onRestart()가 호출된 이후에 이어서 onStart()가 호출됩니다.
💻onDestory()
Activity가 소멸되기 전에 실행이 되며, onDestory()에서 생명주기가 종료됩니다.
onDestory()는 일반적으로 활동 또는 활동이 포함된
프로세스가 제거될 때 활동의 모든 리소스를 해체하도록 구현됩니다.
📜코드로 알아보기
package com.example.myapplication
import android.app.Activity
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.example.myapplication.databinding.ActivityMainBinding
import com.google.firebase.database.DatabaseReference
import com.google.firebase.database.ktx.database
import com.google.firebase.ktx.Firebase
class MainActivity : AppCompatActivity() {
lateinit var binding : ActivityMainBinding
lateinit var database : DatabaseReference
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
Log.d("Lifecycle","onCreate")
setContentView(binding.root)
}
override fun onStart() {
super.onStart()
Log.d("Lifecycle","onStart")
}
override fun onResume() {
super.onResume()
Log.d("Lifecycle","onResume")
}
override fun onRestart() {
super.onRestart()
Log.d("Lifecycle","onReStart")
}
override fun onPause() {
super.onPause()
Log.d("Lifecycle","onPause")
}
override fun onStop() {
super.onStop()
Log.d("Lifecycle","onStop")
}
override fun onDestroy() {
super.onDestroy()
Log.d("Lifecycle","onDestory")
}
}
1️⃣onCreate -> onStart->onResume
- App을 실행한 결과
onCreate
->onStart
->onResume
이 호출된 것을 알 수 있다.
2️⃣onPause()->onStop()
- 홈 버튼을 누르면 해당 App이 화면에서 정말 사라졌기에
onPause()
->onStop()
이 호출되는 것을 알 수 있다. - onPause()까지만 가고 싶었는데 이건 여러 개의 activity가 있어야 할 거같네욥..
3️⃣onRestart()->onStart()->onResume()
- 사라졌던 App을 다시 실행시키니
onRestart()
->onStart()
->onResume()
이 실행되는 것을 알 수 있었습니다.
4️⃣onDestory()
- App을 완전히 종료시키면
onDestory()
가 출력되는 것을 알 수 있습니다.
📜그럼 이제 두 개의 Activity를 이용해서 LifeCycle을 한번 확인해 보겠습니다.
- 상황은 mainActivity에 있는 버튼을 누르면 intent를 이용해서 SecondActivity로 이동하는 상황입니다.
- LifeCycle은
MainActivity
에 해당하는 logcat, LifeCycle2는SecondActivity
에 해당하는 logcat입니다.
- MainActivity에 LifeCycle이
onCreate()
->onStart()
->onResume()
까지 호출된 것을 알 수 있습니다. - 여기서 버튼을 눌러서 액티비티를 전환하면 어떻게 될까요?
- 버튼을 누르면 SecondActivity로 화면이 전환되고, MainActivity는
onPause()
를 호출
그다음 SecondActivity가onCreate()
->onStart()
->onResume()
까지 호출된 것을 알 수 있습니다.
그리고 해당 화면에서 MainActivity가 완전히 사라졌으니onStop
()이 호출된 것도 알 수 있습니다.
- SeconActivity에서 뒤로 가기를 누른다면, LifeCycle2는
onPause()
를 호출하고,
LifeCycle은 다시 호출되었으므로,onRestart()
->onStart()
->onResume()
을 호출할 것입니다. - 여기서 onCreate()는 액티비트를 호출할 때 최초로 실행되기에
onCreate()
는 호출되지 않습니다. - 이렇게 LifeCycle이 제대로 순서를 마쳤으면, LifeCycle2는 화면에서 완전히 사라졌기에,
onStop()
->onDestroy()
를 호출하게 됩니다.
'Skils > Android' 카테고리의 다른 글
[Android] - 안드로이드 설계 패턴 (MVC) (0) | 2023.02.04 |
---|---|
[Android] - Clean Architecture (0) | 2023.01.30 |
[프로젝트] - 모앱1 프젝을 마치며... (2) | 2022.12.16 |
[Android] - 프래그먼트(Fragment) (0) | 2022.11.20 |
[Android] - androidx 라이브러리 (액션바,메뉴 구현) (0) | 2022.11.20 |