Activity 생명주기란?

생명주기는 Android(kotlin)에서 앱이 실행되는 과정에서 사용자와의 상호작용이 있는 Activity컴포넌트에서 백그라운드 실행, 종료 시 어떤 프로세스로 작업이 처리되는지 말하는 것이다.

Note

액티비티가 무엇인지 알고 싶다면 [[001. [Android] 4대 컴포넌트]]

초기 앱 실행 시

onCreate() onStart() onResume() 여기서 순서대로 화면 송출 준비, 화면 송출, 사용자와 상호작용을 담당하고 있다.

앱 사용 중 잠깐 가려질 때

onPause()만 호출되며, 다시 돌아오면onResume()으로 복귀

앱이 완전히 화면에서 사라질 때

onPause() onStop()까지 호출됨. 다시 앱으로 돌아오면 onRestart() onStart() onResume()경로로 복귀

앱 완전 종료 시

onPause() onStop() onDestroy()까지 호출되고 액티비티가 메모리에서 삭제됨.

주요 함수 설명

onCreate()

override fun onCreate(savedInstanceState: Bundle?)

전체 화면을 그리는 액티비티에서 사용하는 콜백이다. 해당 단계에서 레이아웃을 표시할 준비를합니다. 해당 단계에서는 메서드 실행이 끝나더라도 사용자에게 바로 UI요소를 표시되지는 않는다. 그렇다고 콜백의 구현이 추가로 필요한 것은 아니다. 이 경우 콜백 구현이 없이도 적절한 시점에 UI 요소들이 화면에 표시된다. setContent{}를 통해서 메서드를 호출해 액티비티의 UI를 절정하고 필요한 초기화 작업을 수행함. onCreate()는 생명주기에서 일반적으로 한 번만 호출되며, 액티비티가 다시 생성되는 경우에는 추가로 호출된다.

onRestart()

override fun onRestart()

액티비티가 다시 시작될 때는 onStart() 직전에 onRestart()가 호출됨.

onStart()

override fun onStart()

액티비티가 백그라운드에서 포어그라운드로 돌아돌때 수행되는 첫 번째 콜백이다.

Note

액티비티가 백그라운드로 가는 상황

  1. 홈 버튼을 누를 떄
  2. 다른 앱으로 전환할 때
  3. 앱 내에서 새 화면을 열 때

onRestoreInstanceState()

override fun onRestoreInstanceState(savedInstanceState: Bundle?)

onResume()

override fun onResume()

액티비티가 처음 생성되는 과정에서 사용자와 상호작용을 도와주는 제일 마지막에 실행되는 콜백이다. 해당 작업 이후 사용자 이벤트를 받을 수 있으며 응답할 준비가 됩니다.

onSaveInstanceState()

override fun onSaveInstanceState()

onPause()

override fun onPause()

앱을 멈출때 포커스를 잃는 시점이다. 이 이후 onStop()을 통해서 화면을 완전히 사라지게 할 수 있다.

onStop()

override fun onStop()

onPause()이후에 실행되며, 화면을 완전히 사라지게만들때 사용한다.

onDestroy()

override fun onDestroy()

시스템 자원이 부족해 액티비티에서 명시적으로 finish()가 호출돼 액티비티가 종료될 때 또는 사용자가 최근 화면 버튼을 통해 앱을 닫았을 때 호출된다.

직접 로깅하면서 확인하기

Log.d(TAG, "name")
 
companion object {
	private const val TAG = "MainActivity"
}

위 코드에서 볼수 있듯이 companion object를 이용해서 TAG라는 불변 변수를 이용해서 로깅을 진행할 것입니다.

onCreate()

해당 함수는 쉽게 로깅이 가능합니다.

override fun onCreate(savedInstanceState: Bundle?) {  
    super.onCreate(savedInstanceState)  
    setContent {  
        AndroidView(  
            factory = { context ->  
                WebView(context).apply {  
                    settings.javaScriptEnabled = true  
                    webViewClient = WebViewClient()  
                    loadUrl("https://www.google.com")  
                }  
            },  
            modifier = Modifier.fillMaxSize()  
        )  
        Log.d(TAG, "onCreate")  
    }  
}

먼저 onCreate()입니다. 해당 함수가 처음 앱을 실행할때 화면에 보이는 UI를 그려주는 함수였습니다. 그렇다면 해당 로깅 코드를 추가한 상태로 앱을 동작시키면 다음 로깅이 화면에 송출되어야 합니다. 위 사진을 보면 밑에 LogCat을 통해서 onCreate()함수가 정상적으로 실행되는 것을 볼수 있습니다. 위에 다른 로그들이 있는데, 이는 이전 실험을 위해 있었던 로그입니다.

onStart()

onRestart()의 경우 앱이 백그라운드에서 포그라운드로 돌아올때 호출되는 함수입니다. 여기서 앱이 완전히 종료되는 것이 아닌 단순 백그라운드에서 포그라운드로 변경될때만 호출되는 함수라는 것을 잊으면 안됩니다.

onCreate() 함수와 같이 onRestart()함수도 오버라이딩을 해주고 Log.d 함수를 통해서 로깅을 진행하면

애뮬레이터에서 앱을 나갔다가 다시 들어오면 다음과 같이 onRestart()함수가 호출되는 모습을 볼수 있습니다.