액티비티 라이프 사이클 이란?
액티비티의 생성~ 종료까지의 과정을 말한다.
Activity 클래스에서는 액티비티가 상태 변화를 알아차릴 수 있는 콜백 제공한다. 화면 전환, 화면이 가려짐, 종료 등시의 상태 변화 시에 자동으로 호출된다. 이러한 상태 변화가 있을때 마다 생명주기 메서드를 호출하여 상태 변화를 알려준다.
직접 실행을 통해 알아보자 밑에는 화면이 가려짐에 따라서 상태 변화가 어떻게 이루어지는지 알 수 있다.
MainActivity
class MainActivity : AppCompatActivity() {
//생성된 화면 요소를 메모리에 로드 Activity가 생성되면 가장 먼저 호출됨
//화면 Layout 정의, View 생성, Databinding 등은 이곳에 구현함
//생명주기 통틀어서 단 한 번만 수행되는 메소드
//따라서 Activity 최초 실행에 해야하는 작업을 수행하기에 적합함
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d("testt", "onCreate")
}
//Activity가 화면에 표시되기 직전에 호출됨
//화면에 진입할 때마다 실행되어야 하는 작업을 이곳에 구현함
override fun onStart() {
super.onStart()
findViewById<TextView>(R.id.lifecycle1).setOnClickListener {
val intent = Intent(this@MainActivity, MainActivity2::class.java)
startActivity(intent)
}
Log.d("testt", "onStart")
}
//Activity가 화면에 보여지는 직후에 호출됨
//현재 Activity가 사용자에게 포커스인 되어있는 상태(즉 고정되어 있는 상태)
override fun onResume() {
super.onResume()
Log.d("testt", "onResume")
}
//Activity가 화면에 보여지지 않은 직후에 호출됨
//현재 Activity가 사용자에게 포커스아웃 되어있는 상태
//다른 Activity가 호출되기 전에 실행되기 때문에 무거운 작업을 수행하지 않도록 주의해야함
//영구적인 Data는 이곳에 저장
override fun onPause() {
super.onPause()
Log.d("testt", "onPause")
}
//Activity가 다른 Activity에 의해 100% 가려질 때 호출되는 메소드
//홈 키를 누르는 경우, 다른 액티비티로의 이동이 있는 경우가 있음
//이 상태에서 Activity가 호출되면, onRestart() 메소드가 호출됨
override fun onStop() {
super.onStop()
Log.d("testt", "onStop")
}
//onStop()이 호출된 이후에 다시 기존 Activity로 돌아오는 경우에 호출되는 메소드
//onRestart()가 호출된 이후 이어서 onStart()가 호출됨
override fun onRestart() {
super.onRestart()
Log.d("testt", "onRestart")
}
//Activity가 완전히 종료되었을 때 호출되는 메소드
//사용자: finish(), onBackPressed()(기존 액티비티의 onResume()까지 호출된 후 onDestroy() 호출)
//시스템: 메모리부족(프로세스 종료)
//onStop(), onDestroy() 메소드는 메모리 부족이 발생하면 스킵될 수 있음
override fun onDestroy() {
super.onDestroy()
Log.d("testt", "onDestroy")
}
}
MainActivity2
class MainActivity2 : AppCompatActivity() {
//액티비티가 생성될때 최초 실행
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
Log.d("testt", "onCreate2")
}
//화면에 보여지기 시작시
override fun onStart() {
super.onStart()
Log.d("testt", "onStart2")
}
//Activity가 화면에 보여지는 직후에 호출됨
//현재 Activity가 사용자에게 포커스인 되어있는 상태(즉 고정되어 있는 상태)
override fun onResume() {
super.onResume()
findViewById<TextView>(R.id.lifecycle2).setOnClickListener {
val intent = Intent(this@MainActivity2, MainActivity::class.java)
startActivity(intent)
}
Log.d("testt", "onResume2")
}
//Activity가 화면에 보여지지 않은 직후에 호출됨
//현재 Activity가 사용자에게 포커스아웃 되어있는 상태
//다른 Activity가 호출되기 전에 실행되기 때문에 무거운 작업을 수행하지 않도록 주의해야함
//영구적인 Data는 이곳에 저장
override fun onPause() {
super.onPause()
Log.d("testt", "onPause2")
}
//Activity가 다른 Activity에 의해 100% 가려질 때 호출되는 메소드
//홈 키를 누르는 경우, 다른 액티비티로의 이동이 있는 경우가 있음
//이 상태에서 Activity가 호출되면, onRestart() 메소드가 호출됨
override fun onStop() {
super.onStop()
Log.d("testt", "onStop2")
}
//onStop()이 호출된 이후에 다시 기존 Activity로 돌아오는 경우에 호출되는 메소드
//onRestart()가 호출된 이후 이어서 onStart()가 호출됨
override fun onRestart() {
super.onRestart()
Log.d("testt", "onRestart2")
}
//Activity가 완전히 종료되었을 때 호출되는 메소드
//사용자: finish(), onBackPressed()(기존 액티비티의 onResume()까지 호출된 후 onDestroy() 호출)
//시스템: 메모리부족(프로세스 종료)
//onStop(), onDestroy() 메소드는 메모리 부족이 발생하면 스킵될 수 있음
override fun onDestroy() {
super.onDestroy()
Log.d("testt", "onDestroy2")
}
}
Log로 화면의 상태 변화시 마다 어떤 메서드가 호출되는지 알아볼 수 있다. 꼭 직접 눈으로 확인해보는 것을 추천한다.
1. 첫 시작
onCreate -> onStart -> onResume
2.메인 1 -> 메인 2
onPuase -> onCreate2 -> onSart2 -> onResume2 -> onStop
- 기존 화면이 사라질시 바로 onPuase 이후 다른 화면이 완전히 고정된 이후에 onstop으로 넘어감을 알 수 있다.
3. 메인 2 -> 메인 1(뒤로 가기를 눌러 2번 창을 닫았을 경우)
onPause2 -> onRestart -> onStart -> onResume -> onStop2 -> onDestroy2
- 창이 완전히 사라졌을 경우에도 이동된 화면이 onResume(화면이 완전히 고정된 이후에) onStop2 -> onDestroy2를 통해 완전히 없어지는 것을 알 수 있다. (또한 액티비티가 닫혀 완전히 사라짐과 스택이 쌓여 그 위에 덮혀짐은 다름을 알 수 있다.)
4. 메인 2 -> 메인 1 이동
onPause2 -> onCreate -> onStart -> onResume -> onStop2
- 이전 화면으로 돌아가는 것이 아닌 새로운 스택을 생성했을 경우 onCreate부터 다시 생성되는 것을 알 수 있다.
5. 라이프 사이클 1에서 뒤로 버튼을 눌러 앱을 닫았을 때(스택이 메인 1밖에 없을 경우)
onPause -> onStop
- 이 경우 앱이 바로 종료되지는 않는다. 종료되는 동안 시스템은 필요에 따라 더 많은 작업을 수행할 수 있다.
- 앱의 화면을 나가도 액티비티가 바로 사라지지 않음을 알 수 있다.
6. 5번에서 앱을 다시 실행시
onRestart -> onStart -> onResume
'Android > 이론' 카테고리의 다른 글
| suspend 함수 (0) | 2025.05.20 |
|---|---|
| NetWork(네트워크) (1) | 2023.11.23 |
| [안드로이드] Activity Stack(액티비티 스택) singleTask (2) | 2023.11.20 |
| 안드로이드] Activity Stack(액티비티 스택) SingleTop (0) | 2023.11.16 |
| [안드로이드] Activity Stack(액티비티 스택) Standard (0) | 2023.11.14 |
댓글