ABOUT ME

작은 디테일에 집착하는 개발자

Today
-
Yesterday
-
Total
-
  • [Android] 액티비티의 라이프 사이클 (생명주기, Life cycle)
    IT Study/Android 2024. 1. 20. 14:47
    728x90

    안녕하세요. 이번 블로그 글에서는 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 → onDestroy

     

     

    2. 다른 App 실행 시 (= 홈 버튼 클릭 시)

    앱 실행 후, 홈 버튼을 클릭하거나 다른 앱을 실행할 경우

    1) 앱 실행 시
    onCreate → onStart → onResume

    2) 홈 버튼 클릭 시
    onPause → onStop

    3) (백 스택에 존재하는) 앱 재실행 시
    onRestart → onStart → onResume

     

     

    3. 다른 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에 대해 알아보았습니다.

    저도 프로젝트로 안드로이드를 처음 시작했을 때에는 이러한 개념적인 것을 넘겨서, 어려움이 많았습니다.

    이번에 안드로이드의 개념을 공부하며 이론적으로도 완벽한 개발자가 되도록 하겠습니다 :) 😆

Designed by Tistory.