Activity Lifecycle
Activity Lifecycle이란 Activity가 생성되고 종료되기 까지의 상태(State)를 말합니다. Activity는 6개의 주요 Callback method를 제공해주는데 Activity의 상태가 변경될 때마다 각각의 Callback method를 호출해줍니다.
그림1은 Activity의 상태와 Callback method의 관계를 간단히 보여줍니다.
Activity Callback
Callback method에 대해서 간단히 알아보겠습니다.
- onCreate()
Activiy의 상태가 Created가 될 때 호출됩니다. Activity가 생성될 때를 의미합니다.
- onStart()
Activiy의 상태가 Started가 될 때 호출됩니다. Activity가 화면에 보이기(visible) 시작할 때를 의미합니다.
- onResume()
Activiy의 상태가 Resumed가 될 때 호출됩니다. 화면에 Activity가 보이는 상태로, 유저와 interaction 할 수 있는 상태입니다.
- onPause()
Activiy의 상태가 Paused가 될 때 호출됩니다. 이 상태는 다른 Activity가 화면을 덮어서 일부분만 보이거나 투명한 화면이 그 위에 덮었을 때 등, 유저와 interaction 하기 어려운 상태입니다. 하지만 Paused 상태는 Resumed 상태로 다시 돌아갈 수도 있는 상태이기도 합니다. 이 상태에서 동작하지 말아야 할 것이 있다면 Callback method를 통해 멈출 수 있습니다. 또는 자원을 해제할 수 있습니다.
- onStop()
Activiy의 상태가 Stopped가 될 때 호출됩니다. 이 상태는 Activity가 화면에 보이지 않는 상태입니다. Paused 상태와는 다르게 이 상태는 Resumed 상태로 돌아갈 수 없습니다. 하지만 Started 상태로는 돌아갈 수 있습니다. 이 때는 화면에 보이지 않기 때문에 필요없는 자원은 Callback method를 통해 해제시킬 수 있습니다.
- onDestroy()
Activiy의 상태가 destroyed가 될 때 호출됩니다. 이 때는 Activity가 종료되었다는 의미이고 release되지 않은 모든 자원이 release됩니다.
Log로 Callback 확인
직접 Log를 넣고 Callback method가 호출되는지 확인해보세요. 이전 장에서 만든 Project에 이어서 하시면 됩니다.
MainActivity에 아래처럼 Log를 넣습니다.
package com.example.xyz.myapplication;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
public static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.v(TAG, "onCreate(): activity가 생성되었습니다. View를 생성합니다.");
}
@Override
protected void onStart() {
super.onStart();
Log.v(TAG, "onStart(): activity가 화면에 보이게(visible) 됩니다.");
}
@Override
protected void onResume() {
super.onResume();
Log.v(TAG, "onResume(): 유저와 interaction할 수 있습니다.");
}
@Override
protected void onPause() {
super.onPause();
Log.v(TAG, "onPause(): 유저와 interaction할 수 없습니다.");
}
@Override
protected void onStop() {
super.onStop();
Log.v(TAG, "onStop(): activity가 더이상 화면에 보이지 않습니다.");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.v(TAG, "onDestroy(): activity가 종료되었습니다. 모든 자원을 release합니다.");
}
void onButtonClick(View v) {
Intent intent = new Intent(this, SubActivity01.class);
startActivity(intent);
Log.d(TAG, "onButtonClick: SubActivity01을 실행시켰습니다.");
}
}
직접 실행해서 로그를 확인해보세요.
앱을 실행시켜 MainActivity가 화면에 보일 때 아래 로그들이 나옵니다. Activity가 created >> started >> resumed 상태로 변경되었다는 것을 의미합니다.
08-15 11:14:14.591 7724-7724/com.example.xyz.myapplication V/MainActivity: onCreate(): activity가 생성되었습니다. View를 생성합니다.
08-15 11:14:14.591 7724-7724/com.example.xyz.myapplication V/MainActivity: onStart(): activity가 화면에 보이게(visible) 됩니다.
08-15 11:14:14.593 7724-7724/com.example.xyz.myapplication V/MainActivity: onResume(): 유저와 interaction할 수 있습니다.
Home 버튼을 눌러 Launcher 화면이 보이도록 해보세요.(Activity가 보이지 않게 만드세요) 로그를 확인해보면 resumed >> paused >> stopped 상태로 변경되었다는 것을 알 수 있습니다.
08-15 11:22:17.662 7724-7724/com.example.xyz.myapplication V/MainActivity: onPause(): 유저와 interaction할 수 없습니다.
08-15 11:22:17.790 7724-7724/com.example.xyz.myapplication V/MainActivity: onStop(): activity가 더이상 화면에 보이지 않습니다.
다시 앱을 실행시켜 보세요. Activity가 paused >> started >> resumed 상태로 변경된 것을 확인할 수 있습니다.
08-15 11:23:56.101 7724-7724/com.example.xyz.myapplication V/MainActivity: onStart(): activity가 화면에 보이게(visible) 됩니다.
08-15 11:23:56.101 7724-7724/com.example.xyz.myapplication V/MainActivity: onResume(): 유저와 interaction할 수 있습니다.
Activity의 상태가 변경될 때 그림1의 그래프처럼 단계적으로 변경됩니다. Callback method도 각 단계마다 모두 호출되는 것을 Log로 확인해보았습니다.
최종 상태가 paused 상태로 변경되는 케이스는 이 장에서 확인해보지 못했습니다. 앱의 일부분이 가려지거나 투명한 화면이 위에 덮히는 등의 경우가 일반적인 상황은 아닌데, 앞으로 개발하시면서 경험하실 수 있을 것 같습니다.
정리
Activity lifecycle에 대해서 알아보고 Activity가 제공해주는 Callback method에 대해서 알아보았습니다. 또한 Log를 넣어 실제로 callback method가 호출되는지 확인도 해보았습니다. Lifecycle에 대해서 더 자세한 내용을 알고 싶으시면 Activity lifecycle: Android API Guide을 참고바랍니다.
이 튜토리얼에서 사용한 코드는 GitHub: Activity lifecycle에서 확인하실 수 있습니다.
참고
Related Posts
- Android 14 - 사진/동영상 파일, 일부 접근 권한 소개
- Android - adb push, pull로 파일 복사, 다운로드
- Android 14 - 암시적 인텐트 변경사항 및 문제 해결
- Jetpack Compose - Row와 Column
- Android 13, AOSP 오픈소스 다운로드 및 빌드
- Android 13 - 세분화된 미디어 파일 권한
- Android 13에서 Notification 권한 요청, 알림 띄우기
- Android 13에서 'Access blocked: ComponentInfo' 에러 해결
- 에러 해결: android gradle plugin requires java 11 to run. you are currently using java 1.8.
- 안드로이드 - 코루틴과 Retrofit으로 비동기 통신 예제
- 안드로이드 - 코루틴으로 URL 이미지 불러오기
- Android - 진동, Vibrator, VibrationEffect 예제
- Some problems were found with the configuration of task 에러 수정
- Query method parameters should either be a type that can be converted into a database column or a List
- 우분투에서 Android 12 오픈소스 다운로드 및 빌드
- Android - ViewModel을 생성하는 방법
- Android - Transformations.map(), switchMap() 차이점
- Android - Transformations.distinctUntilChanged() 소개
- Android - TabLayout 구현 방법 (+ ViewPager2)
- Android - 휴대폰 전화번호 가져오는 방법
- Android 12 - Splash Screens 알아보기
- Android 12 - Incremental Install (Play as you Download) 소개
- Android - adb 명령어로 bugreport 로그 파일 추출
- Android - adb 명령어로 App 데이터 삭제
- Android - adb 명령어로 앱 비활성화, 활성화
- Android - adb 명령어로 특정 패키지의 PID 찾기
- Android - adb 명령어로 퍼미션 Grant 또는 Revoke
- Android - adb 명령어로 apk 설치, 삭제
- Android - adb 명령어로 특정 패키지의 프로세스 종료
- Android - adb 명령어로 screen capture 저장
- Android - adb 명령어로 System 앱 삭제, 설치
- Android - adb 명령어로 settings value 확인, 변경
- Android 12 - IntentFilter의 exported 명시적 선언
- Android - adb 명령어로 공장초기화(Factory reset)
- Android - adb logcat 명령어로 로그 출력