안드로이드를 공부할 때 가장 먼저 공부하게 되는 것 중에 하나가 생명주기입니다.
안드로이드 4대 컴포넌트 중 하나인 액티비티의 생명주기에 관해서 적어보려고 합니다.
차근차근 알아보겠습니다.
1. 액티비티 생명주기(Activity Lifecycle)
액티비티 생명주기에 대한 내용이 안드로이드 공식문서에 다음과 같이 적혀 있습니다.
사용자가 앱을 탐색하고, 앱에서 나가고, 앱으로 다시 돌아가면, 앱의 Activity 인스턴스는 생명 주기 안에서 서로 다른 상태를 통해 전환됩니다.
Activity 클래스는 여러 콜백을 제공합니다.
https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko
활동 수명 주기 | Android Developers
활동은 사용자가 전화 걸기, 사진 찍기, 이메일 보내기 또는 지도 보기와 같은 작업을 하기 위해 상호작용할 수 있는 화면을 제공하는 애플리케이션 구성요소입니다. 각 활동에는 사용자 인터페
developer.android.com

액티비티 생명주기는 위의 액티비티 생명주기 순서표에서 보이는 것과 같이 7가지가 존재합니다.
각각의 특징을 설명해 보겠습니다.
onCreate()
- 앱이 처음 실행될 때 한 번만 호출됩니다.
- 보통 이곳에서 Layout이나 View를 초기화해주고, ViewModel이나 DataBinding을 초기화합니다.
onStart()
- 액티비티가 처음 화면에 보이기 직전에 호출됩니다.
onResume()
- onStart()가 호출이 완료되면 바로 호출됩니다.( 액티비티가 화면에 다 표시되는 직후 )
onPause()
- 액티비티가 일부분이 보이지 않은 상태에 호출이 됩니다.
- 아주 잠깐 실행되기 때문에 오래 걸리는 작업은 하지 않는 것이 좋습니다.
onStop()
- 액티비티가 더 이상 사용되지 않았을 때( 화면 전부가 보이지 않게 되었을 때) 호출
- 다른 말로 다른 액티비티가 스택 최상단에 쌓여서 가려지게 되면 onStop이 호출됩니다.
onDestroy()
- 액티비티가 완전히 끝났을 때 호출됩니다.
- finish함수를 호출했다던지 Activity를 제거하는 경우입니다.
onRestart()
- onStop()이 호출된 이후에 다시 기존 액티비티로 돌아오는 경우에 호출
- onRestart()가 호출된 이후 이어서 onStart()가 호출됨
생명주기 확인하기 위한 코드
메인액티비티에 각 생명주기에 해당하는 메서드들에 Log를 찍어서 확인해 보겠습니다.
MainActivity.class
package abled.semina.lifecycle;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private String TAG = "생명주기 확인";
Button buttonMoveSubActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonMoveSubActivity = findViewById(R.id.buttonMoveSubActivity);
Intent moveToSubActivityIntent = new Intent(this, SubActivity.class);
buttonMoveSubActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(moveToSubActivityIntent);
}
});
Log.d(TAG, "onCreate: MainActivity");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart: MainActivity");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume: MainActivity");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause: MainActivity");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop: MainActivity");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: MainActivity");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart: MainActivity");
}
}
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/buttonMoveSubActivity"
android:layout_width="200dp"
android:layout_height="100dp"
android:text="SubActivity로 이동"
android:textSize="18sp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
SubActivity.class
package abled.semina.lifecycle;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class SubActivity extends AppCompatActivity {
private String TAG = "생명주기 확인";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart: SubActivity");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume: SubActivity");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause: SubActivity");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop: SubActivity");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: SubActivity");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart: SubActivity");
}
}
activity_sub.xml
서브는 생성한 그대로 뒀습니다.
궁금한 생명주기 순서들을 몇 가지 알아보겠습니다.
예를 들어 MainActivity에서 onCreate가 호출되면 M_onCreate로 정리하겠습니다.
1. 메인 액티비티 실행 시

생명주기 호출 순서 정리
- M_onCreate
- M_onStart
- M_onResume
2. 메인 액티비티 종료 시

시스템 뒤로 가기로 앱을 내렸을 때 onPause에서 onStop 까지만 호출되었습니다.
메모리상에서 완전히 종료했을 때 onDestroy가 호출되었습니다.
- M_onPuase
- M_onStop
- M_onDestory
3. 메인 액티비티 실행 후 회전

회전을 하게 되면 액티비티가 완전히 종료된 후에 다시 실행이 되는 것을 확인할 수 있습니다.
- M_onCreate
- M_onStart
- M_onResume
- M_onPuase
- M_onStop
- M_onDestory
- M_onCreate
- M_onStart
- M_onResume
4. 메인 액티비티에서 서브 액티비티로 이동

메인액티비티의 onPuase 이후 서브액티비티의 onResume까지 진행 후 다시 메인액티비티의 onStop이 호출됩니다.
- M_onCreate
- M_onStart
- M_onResume
- M_onPuase
- S_onCreate
- S_onStart
- S_onResume
- M_onStop
5. 서브 액티비티 종료

서브 액티비티의 onPause가 호출되고 메인액티비티는 스택에 남아 종료되지 않았기 때문에 onCreate 대신 onRestart가 호출되고 onResume까지 진행 후 서브액티비티의 onStop, onDestroy가 호출된다.
- S_onPause
- M_onRestart
- M_onStart
- M_onResume
- S_onStop
- S_onDestroy
안드로이드 앱을 개발하면서 가장 중요한 스킬 중에 하나가 생명주기를 잘 다루는 것이라고 생각하는데, 머리로만 알고 있는 것보다 직접 확인해 보는 것이 내 것으로 만들 이 용이한 것 같다.
진작부터 생명주기 관련된 글을 포스팅하고 싶었는데 기초부터 다시 공부를 하다 보니 포스팅할 기회가 생겨서 다행이다.
'안드로이드' 카테고리의 다른 글
[Android] 안드로이드 앱으로 아두이노 제어하기 (USB 시리얼 통신) (7) | 2024.11.10 |
---|---|
[Android] Fragment Lifecycle (1) | 2024.11.09 |
[Android] 기본 스플래시 없애기 (0) | 2024.08.21 |
[Android] MVVM 패턴 예제! (1) | 2024.08.18 |
[Android] MVP 패턴 예제! (0) | 2024.08.17 |