지난 글에 이어서 이번에는 직접 생명주기 메소드를 사용하여 안드로이드 스튜디오에서 실행해보며 어떤 순서로 동작하는 지 알아보자
먼저 생명주기 호출 함수를 override하여 내부에서 로그를 찍어보며 확인하도록 로그를 찍어보았다.
MainActivity.kt
package com.example.myapplication
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.i(TAG, "onCreate()")
val btn = findViewById<Button>(R.id.button1)
btn.setOnClickListener {
startActivity(Intent(this, SecondActivity::class.java))
}
}
override fun onStart() {
super.onStart()
Log.i(TAG, "onStart()")
}
override fun onResume() {
super.onResume()
Log.i(TAG, "onResume()")
}
override fun onPause() {
super.onPause()
Log.i(TAG, "onPause()")
}
override fun onStop() {
super.onStop()
Log.i(TAG, "onStop()")
}
override fun onRestart() {
super.onRestart()
Log.i(TAG, "onRestart()")
}
override fun onDestroy() {
super.onDestroy()
Log.i(TAG, "onDestroy()")
}
companion object {
const val TAG = "First Activity"
}
}
SecondActivity.kt
package com.example.myapplication
import android.annotation.SuppressLint
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
Log.i(MainActivity.TAG, "onCreate()")
val btn = findViewById<Button>(R.id.button2)
btn.setOnClickListener {
startActivity(Intent(this, MainActivity::class.java))
}
}
override fun onStart() {
super.onStart()
Log.i(TAG, "onStart()")
}
override fun onResume() {
super.onResume()
Log.i(TAG, "onResume()")
}
override fun onPause() {
super.onPause()
Log.i(TAG, "onPause()")
}
override fun onStop() {
super.onStop()
Log.i(TAG, "onStop()")
}
override fun onRestart() {
super.onRestart()
Log.i(TAG, "onRestart()")
}
override fun onDestroy() {
super.onDestroy()
Log.i(TAG, "onDestroy()")
}
companion object{
const val TAG = "Second Activity"
}
}
먼저, 앱 첫 진입이다.
생명주기 그래프처럼 액티비티가 running 상태로 가기전까지 onCreate() -> onStart() -> onResume()이 호출된 것을 볼 수 있다.
Main -> Sub
이제, Main Activity에서 Second Activity로 가보자
Main Activity의 버튼을 누르면 MainActivity가 먼저 pause되고 SecondActivity가 실행되기 시작한다. Second Activity가 완전이 실행되고 나서야 Main Activity가 stop이된다.
이 점을 주의해서 보아야 할 것 같다.
우리가 앱을 눈으로 봤을 때는 Main Activity가 완전히 사라지고 Second Activity가 실행 되는 것 처럼 보이는데 생명주기로는 전혀 그렇지 않다는 것이다. (onPause -> onStop -> onCreate(new activity))
왜인지 한 번 찾아보았다. (gpt 사용)
이렇다고 한다. 즉, onPause -> onStop -> onCreate로 동작을 하게되면 이전 액티비티에서 onStop()이 오래걸릴 경우 onCreate()도 오래 걸리니 새로운 액티비티가 보이는데 까지 시간이 지연되어 사용자 경험을 떨어뜨린다고한다.
이해는 하였는데 gpt가 아닌 영문 검색으로도 한 번 찾아봐야겠다는 생각이 든다. (한국어 검색은 결론을 찾기 힘들었음)
Sub -> Main
다시 돌아와서 Second Activity에서 Main Activity로 올 때의 생명주기를 살펴보자
Main Activity에서 Second Activity로 온 것과 같게 동작을 하였다.
Main -> Home -> Main
이번엔 Main Activity에서 홈화면으로 나갔다가 다시 돌아온 케이스이다.
밑줄 친 부분이 홈 화면으로 나갔을 때의 호출된 생명 주기이다. onPause -> onStop이 불려 액티비티가 Stop상태가 된다.
다시 돌아오면 onRestart()가 불려 액티비티가 재시작된다.
OTHER
이외에도 멀티 윈도우가 켜졌을 때의 생명주기, 공유 버튼을 눌러서 액티비티의 일부만 가려졌을 떄의 생명주기 등
다양한 상황이 있을 것이다. 지금은 정말 간단한 상황에서만의 생명주기를 다루어보았지만 복잡한 생명주기를 다룰 때에는 이렇게 로그를 확인해가면서 생명주기에 맞게 프로그램을 구성하면 될 것이다.
결론
Activity Lifecycle를 잘 이해하고 활용하는 것은 안드로이드 개발에 있어 중요한 부분이다. 이를 통해 사용자들에게 편리하고 안정적인 앱을 제공하며, 앱의 성능과 사용성을 높일 수 있다.
따라서 액티비티 생명주기에 대한 이해를 바탕으로 앱 개발에 임하는 것이 앱의 성공에 큰 도움이 될 것이라 생각한다.
'Android' 카테고리의 다른 글
[Android] ActionBar? ToolBar! (0) | 2023.08.11 |
---|---|
[Android] RecyclerView (0) | 2023.08.10 |
[Android] TabLayout의 불편한 점을 덜어주는 ViewPager2 적용기 (0) | 2023.08.09 |
[Android] Activity Lifecycle (0) | 2023.08.02 |
[Android UI] PX, DPI, DP (feat. 다양한 기기와 해상도) (0) | 2023.08.01 |