-
[Android] 액티비티의 라이프 사이클 (생명주기, Life cycle)IT Study/Android 2024. 1. 20. 14:47728x90
안녕하세요. 이번 블로그 글에서는 Android 개발 시 주로 사용되는 Activity의 생명주기에 대해 알아보도록 하겠습니다.
먼저, Activity의 Life Cycle을 확인하기 위해 아래와 같은 테스트 시나리오를 작성하였습니다.
📊 테스트 시나리오
1. Activity 실행, 종료 시의 Life cycle
2. 다른 App 실행 시 (= 홈 버튼 클릭 시)의 Life cycle
3. 다른 Activity 실행 시의 Life cycle또한 Activity의 Life Cycle을 확인하기 위해 아래와 같은 테스트 코드를 작성하였습니다.
MainActivity.kt
package fastcampus.part0.kotlin 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 // Life cycle 콜백 함수를 override 한 상태 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) } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/button" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_marginTop="300dp" android:text="다른 액티비티 실행" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/button2" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_marginBottom="300dp" android:text="액티비티 종료" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
다른 액티비티를 실행하는 경우를 테스트 하기 위해 NextActivity를 하나 더 만들어주도록 하겠습니다.
NextActivity.kt
package fastcampus.part0.kotlin 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") } }
activity_next.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".NextActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Next Activity" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
테스트 결과를 보기 전, Activity의 Life cycle에 대해 알아보도록 하죠.
📚 Activity의 Life cycle
Life cycle 특징 onCreate 액티비티 초기화 및 레이아웃 설정 작업 onStart 액티비티 사용자에 보여지기 전 onRestart 액티비티 중지 후 재시작 전 onResume 액티비티 사용자와 상호작용 전 onPause 액티비티 일시 중지 or 다른 액티비티가 화면을 가릴 경우 onStop 액티비티 사용자에 표시되지 않을 경우 onDestroy 액티비티 소멸되기 전 개념적으로만 접근했을 때에는 이해하기 쉽지 않은데요,
테스트 시나리오에 따른 실행 결과를 보도록 하겠습니다.
📎 실행 결과
1. Activity 실행, 종료 시
단순히 Activity를 실행하고 종료할 경우
1) 앱 실행 시
onCreate → onStart → onResume
2) 앱 종료 시 (종료 버튼 클릭 시)
onPause → onStop → onDestroy2. 다른 App 실행 시 (= 홈 버튼 클릭 시)
앱 실행 후, 홈 버튼을 클릭하거나 다른 앱을 실행할 경우
1) 앱 실행 시
onCreate → onStart → onResume
2) 홈 버튼 클릭 시
onPause → onStop
3) (백 스택에 존재하는) 앱 재실행 시
onRestart → onStart → onResume3. 다른 Activity 실행 시
한 어플리케이션 내에서 다른 Activity 실행 시
1) 다른(Next) 액티비티 실행 시
(Main) onPause
(Next) onCreate → onStart → onResume
(Main) onStop
2) 원래(Main) 액티비티로 돌아올 경우 = 다른(Next) 액티비티 종료 시
(Next) onPause
(Main) onRestart → onStart → onResume
(Next) onStop → onDestroy🚩 4. 화면 방향을 전환할 경우
1) 앱 실행 시
onCreate → onStart → onResume
2) 화면 방향 전환할 경우
onPause → onStop → onDestroy → onCreate → onStart → onResume
액티비티 종료 생명주기를 거치고, onCreate부터 생명주기가 다시 시작된다.이렇게 개념적으로 글씨만을 읽을 때에는 이해되지 않았던 Activity의 Life cycle에 대해 알아보았습니다.
저도 프로젝트로 안드로이드를 처음 시작했을 때에는 이러한 개념적인 것을 넘겨서, 어려움이 많았습니다.
이번에 안드로이드의 개념을 공부하며 이론적으로도 완벽한 개발자가 되도록 하겠습니다 :) 😆
'IT Study > Android' 카테고리의 다른 글
[Android] counter(계수기, 숫자 세기) 앱 (feat. 화면 회전 시 초기화, 화면 회전 시 UI 가려지기, weight) (1) 2024.01.21 [Android] View 그려지는 과정 (뷰가 그려지는 순서) (2) 2024.01.20 [Kotlin] 코틀린 중급 (feat. 람다, 확장함수, Scope function, 초기화 지연 등...) (0) 2024.01.15 [Kotlin] 코틀린 기초 (feat. 함수, 클래스, Null 등...) (0) 2024.01.14 [Android] 안드로이드... 개념적인 것도 공부해보자! (0) 2023.12.10