Activity Lifecycle
Activity Lifecycle은 Activity가 생성되고 종료되기까지의 상태(State)를 말합니다. Activity는 6가지의 Callback method를 제공해주는데 Activity의 상태가 변경될 때마다 각각의 Callback method를 호출해줍니다.
다음 사진은 Activity Lifecycle을 간략하게 표현한 그림입니다.
Callback Method
1. onCreate()
Activity가 생성될 때 실행되는 것으로, 필수적으로 구현해야 합니다. onCreate()에서는 Activity가 생명 주기 중 한 번만 발생해야 하는 기본 애플리케이션 시작 로직을 실행합니다. 이 메서드는 saveInstanceState 매개변수를 수신하는데, 이는 Activity의 이전 저장 상태가 포함된 Bundle 객체입니다. 처음 생성된 Activity인 경우 Bundle 객체의 값은 null입니다.
또한 setContentView 메서드에 XML 레이아웃 파일의 리소스 ID를 전달해야 정의한 화면이 정상적으로 나타나게 됩니다.
2. onStart()
Activity가 시작되면 onStart()가 호출됩니다. onStart()가 호출되면 Activity가 사용자에게 표시됩니다.
3. onResume()
Activiy의 상태가 재개될 때 호출됩니다. 앱이 사용자와 상호작용합니다. 어떠한 이벤트 발생으로 앱에서 포커스가 떠날 때까지 유지됩니다.
4. onPause()
사용자가 Activiy를 떠날 때 호출됩니다. 이 상태는 다른 Activity가 화면을 덮어서 일부분만 보이거나 투명한 화면이 그 위에 덮었을 때 등, 사용자와 상호작용하기 어려운 상태입니다. onPause()는 아주 잠깐 실행되므로 저장 작업을 실행하기에는 시간이 부족할 수 있습니다. 그러므로, onPuase()를 사용하여 사용자 데이터를 저장하거나, 네트워크 호출을 하거나, 데이터베이스 트랜잭션을 실행해서는 안 됩니다. 이러한 작업은 메서드 실행이 끝나기 전에 완료되지 못할 수도 있기 때문에 부하가 큰 종료 작업은 onStop() 상태일 때 실행해야 합니다.
onPause() 상태는 Resumed 상태로 다시 돌아갈 수도 있는 상태이기도 합니다. 이 상태에서 동작하지 말아야 할 것이 있다면 Callback method를 통해 멈출 수 있습니다.
5. onStop()
Activity가 사용자에게 더 이상 표시되지 않을 때 호출됩니다. 이 메서드에서는 앱이 사용자에게 보이지 않는 동안 앱은 필요하지 않은 리소스를 해제하거나 조정해야 합니다. Activity를 다시 시작하면 onRestart()가 호출되고, 실행 종료하면 onDestroy()가 호출됩니다.
6. onDestory()
Activity가 소멸되기 전에 호출됩니다. 사용자가 Activity를 완전히 닫거나 Activity에서 finish()가 호출되어 종료되는 경우, 구성 변경으로 인해 시스템이 일시적으로 Activity를 소멸시키는 경우가 해당됩니다. onDestroy()는 이전 Callback 메서드에서 해제되지 않은 모든 리소스를 해제해야 합니다.
Log를 이용한 Callback Method 확인
MainActivity와 SubActivity를 만들어서 Log를 확인해봅니다.
다음은 MainActivity 소스코드입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
package com.example.myapplication;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
public static final String TAG = "Test!!";
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.v(TAG, "MainActivity onCreate 실행");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_next).setOnClickListener(view ->
startActivity(new Intent(MainActivity.this, SubActivity.class))
);
}
@Override
protected void onRestart() {
Log.v(TAG, "MainActivity onRestart 실행");
super.onRestart();
}
@Override
protected void onResume() {
Log.v(TAG, "MainActivity onResume 실행");
super.onResume();
}
@Override
protected void onStop() {
Log.v(TAG, "MainActivity onStop 실행");
super.onStop();
}
@Override
protected void onPause() {
Log.v(TAG, "MainActivity onPause 실행");
super.onPause();
}
@Override
protected void onStart() {
Log.v(TAG, "MainActivity onStart 실행");
super.onStart();
}
@Override
protected void onDestroy() {
Log.v(TAG, "MainActivity onDestroy 실행");
super.onDestroy();
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
Log.v(TAG, "MainActivity onSaveInstanceState 실행");
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle saveInstanceState) {
Log.v(TAG, "MainActivity onRestoreInstanceState 실행");
super.onRestoreInstanceState(saveInstanceState);
}
}
|
cs |
다음은 SubActivity 소스코드입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
package com.example.myapplication;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class SubActivity extends AppCompatActivity {
public static final String TAG = "Test!!";
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.v(TAG, "SubActivity onCreate 실행");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
}
@Override
protected void onRestart() {
Log.v(TAG, "SubActivity onRestart 실행");
super.onRestart();
}
@Override
protected void onResume() {
Log.v(TAG, "SubActivity onResume 실행");
super.onResume();
}
@Override
protected void onStop() {
Log.v(TAG, "SubActivity onStop 실행");
super.onStop();
}
@Override
protected void onPause() {
Log.v(TAG, "SubActivity onPause 실행");
super.onPause();
}
@Override
protected void onStart() {
Log.v(TAG, "SubActivity onStart 실행");
super.onStart();
}
@Override
protected void onDestroy() {
Log.v(TAG, "SubActivity onDestroy 실행");
super.onDestroy();
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
Log.v(TAG, "SubActivity onSaveInstanceState 실행");
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle saveInstanceState) {
Log.v(TAG, "SubActivity onRestoreInstanceState 실행");
super.onRestoreInstanceState(saveInstanceState);
}
}
|
cs |
실행해보면 여러 상황에서의 Log를 확인할 수 있습니다.
1. MainActivity 실행
2. SubActivity로 이동
3. 뒤로 가기 버튼으로 MainActivity로 이동
4. MainActivity에서 화면을 돌렸을 때
5. MainActivity에서 홈 화면으로 나갔을 때
6. 홈 화면에서 MainActivity로 돌아왔을 때
7. 뒤로 가기로 종료했을 때
이렇게 Activity Lifecycle에 대한 개념과 Log를 이용해서 Callback Method 호출을 확인했습니다. Activity에 대한 더 많은 정보를 얻고 싶다면 안드로이드 공식 문서를 참고해주시길 바랍니다.
출처 :
developer.android.com/guide/components/activities/activity-lifecycle?hl=ko
'안드로이드' 카테고리의 다른 글
[안드로이드] ANR(Application Not Responding) (0) | 2021.01.19 |
---|---|
[안드로이드] Glide 라이브러리 (0) | 2021.01.18 |
[안드로이드] Service (0) | 2021.01.14 |
[안드로이드] Fragment Lifecycle (0) | 2021.01.12 |
[안드로이드] Android Jetpack (0) | 2020.12.31 |