Part0_Ch03_03 Activity 생명주기 (1)
1) Activity Lifecycle
- 앱의 완성도와 안정성을 높이기 위해 반드시 알아야 함
- 다른 앱으로 전환 시, 비정상 종료되는 문제
- 사용자가 앱을 사용하지 않는데, 시스템 리소스가 소비되는 문제
- 사용자가 앱을 나갔다가 돌아왔을 때, 진행상태가 저장되지 않는 문제
- 화면이 가로 ↔ 세로 전환될 때, 비정상 종료되거나, 진행상태가 저장되지 않는 문제
콜백
1) onCreate
- 필수적으로 구현해야 함
- Activity 의 생명주기 중 한 번만 발생해야하는 로직을 실행
- 멤버 변수 정의
- UI 구성 ( setContentView, xml 레이아웃 파일 정의 )
- saveInstanceState 매개 변수 수신 → Activity 이전 저장 상태가 포함된 Bundle 객체
2) onStart
- Activity 가 사용자에게 표시됨
- 앱은 Activity 를 포그라운드로 보내 상호작용할 수 있도록 준비
3) onResume
- Activity 가 포그라운드에 표시되어, 사용자와 상호 작용 할 수 있는 상태
- 앱에서 포커스가 떠날 때 까지 onResume 상태에 머무름
4) onPause
- 사용자가 활동을 떠나는 첫 번째 신호
- 매우 짧음
- 활동이 포그라운드에 있지 않지만, 잠시 후 다시 시작할 작업을 일시중지 하거나 조정
- ex) 반투명 Activity 가 띄워져 포커스는 없지만 화면에 보이는 상태
- 이 상태를 통해서, 실행중이지 않을 때 필요하지 않은 리소스를 해지할 수 있음
- 이 상태에서, 데이터를 저장하거나, 네트워크 호출, DB의 IO 작업을 하면 안 됨
- 매우 짧은 시간이라 메서드가 끝나기 전에 Activity 가 종료될 수 있음
5) onStop
- Activity 가 사용자에게 더 이상 표시 되지 않는 상태
- CPU 를 비교적 많이 소모하는 종료 작업을 실행해야 함
- DB 저장
- Activity 가 중단되면, Android OS 에서 리소스 관리를 위해, 해당 Activity 가 포함된 프로세스를 소멸시킬 수 있음
6) onDestroy
- Activity 가 완전히 종료되기 전에 실행
- 호출되는 케이스
- finish 메서드가 호출 되어 Activity 가 종료될 때
- configurationChange (ex 기기 회전, 멀티 윈도우) 로 인해, 시스템이 Activity 를 일시적으로 소멸시킬 때
2) Activity LifeCycle Image
출처: https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko
활동 수명 주기 | Android Developers
활동은 사용자가 전화 걸기, 사진 찍기, 이메일 보내기 또는 지도 보기와 같은 작업을 하기 위해 상호작용할 수 있는 화면을 제공하는 애플리케이션 구성요소입니다. 각 활동에는 사용자 인터페
developer.android.com
[ 생명주기 추가 설명]
[1] OnCreate
onCreate, onStart 는 콜백이 호출된 다음
그 상태에 머무는 것이 아니라
바로 그 다음 상태로 전환이 된다.
onCreate 가 불리고 멈춰있는 상태는 없고
onStart 가 불리고 멈춰있는 상태도 없다.
onCreate가 불린 후에는
바로 onStart 가 불린다.
UI 구성
Activity 생명주기 중 한 번만 그리면 됨
SetContentView
화면을 그리기 위한 내용
SaveInstanceState
이전 저장 상태를 포함한다고 했으므로
1) Activity 가 최초로 한 번만 실행되었을 때는 값은 NULL 임
이전 저장상태가 없기 때문
2) 이전 저장 상태를 저장할 필요가 없다고 하면
매번 다시 실행되므로 값은 늘 NULL
[3] OnResume
onResume 같은 경우는 이 상태에 머물러있다.
onCreate, onStart 는 스쳐지나가는 상태라면
onResume 는 머무르는 상태라는 특징이 있다.
사용자와 상호작용 할 수 있는 상태
화면이 눈 앞에 보이는 상태 화면에서 클릭할 수 있고,
키보드 칠 수 있고,
Activity 에서 표현되는 데이터도 볼 수 있는 상태
[4] OnPause
onPause 상태에 머무는 경우는 거의 없고
skip 해서 지나가는 상태 중 하나
사용자가 이 Activity를 통해서
뭔가 할 수 있는 상호작용이 없는 상태가 되는
트리거 같은 콜백
리스닝을 하거나
리소스를 사용할 필요가 없으므로
리소스를 해지하는 작업을 하면 됨
Activity 가 지금 당장 사용자 눈 앞에 보이지 않을지언정
재시작할 수 있는 상태
Activity 가 있는데, 그 위에 반투명한 Activity가 띄워지게 되면
화면이 아예 없어지는 것은 아님
위는 onPause 상태로 머무르는 케이스이다.
매우 짧은 시간 이라 메서드가 끝나기 전에
Activity가 종료될 수 있음
매우 짧은 시간이기 때문에
이때 호출된 메서드가
반드시 끝까지 호출될 수 있음을 보장할 수 없음
[5] OnStop
앱을 실행하고 있다가
홈 버튼을 눌러서
해당 앱을 종료하지 않고 잠깐 백스택에 두는 경우
해당 Activity는 사용자 눈앞에 보이지도 않고
상호작용하는 상태도 아님
Activity 가 Running 되는 상태도 아님
onPause 상태를 거쳐서
onStop 상태가 된다.
Activity 가 중단되면, Android OS 에서 리소스 관리를 위해,
해당 Activity 가 포함된 프로세스를 소멸시킬 수 있음
안드로이드 OS 입장에서는
지금 사용자가 당장 하고자 하는 동작
지금 당장 사용하고자 하는 앱이
우선순위가 높다.
1) 실행한 지 시간이 오래 지났거나
2) 리소스를 많이 사용하고 있는 상태에서는
사용자와 인터랙션이 없는 Activity 를 유지할 이유가 없다.
그래서 onStop 상태일 때
안드로이드 OS 관점에서
리소스를 계속 사용할 필요가 없다고 판단되는 시점이 오면
프로세스를 kill 한다.
onStop 상태에서
1) 프로세스를 kill 하지 않은 상태에서
다시 실행하게 되면
onRestart, onStart, onResume 가 호출이 됨
2) 프로세스를 kill 했다면
다시 onCreate 부터 실행
[6] OnDestroy
멀티 윈도우
원래 Android OS 에서 멀티윈도우를 지원했던 것은 아님
나중에 폴더블 폰이나 화면이 큰 것이 나오니까
여러개의 Activity와 여러 개의 앱을
동시에 실행할 수 있는 케이스가 나오면서
멀티 윈도우를 고려한 Life Cycle 이 추가가 되었음
처음에 Activity 의 Life Cycle 을 공부할 때는
멀티 윈도우의 생명주기는 제외하고
학습하는 것을 권장함
[ 생명주기 부연설명 ]
- Activity가 최초 실행되었을 때,
onCreate(), onStart(), onResume() 가 호출됨.
- onResume() 가 실행되면
실제로 사용자가 앱이 상호작용할 수 있는
Activity running 상태가 된다.
- onPause() 상태는 잠깐 일시정지 상태로
다른 Activity가 사용자에게 보여지려고 하는 시점에
원래 보고 있던 것이 onPause() 상태가 되고,
다른 Activity 가 아예 안 보이게 되는 시점에는
onStop() 까지 호출된다.
- onStop() 상태에서도
해당 Activity 를 종료하겠다고 명시적으로 표현을 하거나,
configuration change 처럼 화면이 전환되거나,
앱이 아예 꺼져버린다면
onDestroy() 가 호출 되어서 모두 종료가 된다.
- 대신 onStop() 상태에서 다시 실행을 했을 때,
OS 에 의해서 해당 Activity 를 포함한 프로세스가 kill 되지 않았다면,
onRestart() 가 불린 다음에,
onStart(), onResume() 가 호출이 되어서
다시 Activity 가 실행된다.
- OS 에 의해서 리소스 최적화를 위해서
Activity 를 가지고 있는 프로세스가 kill 이 되었다면,
다시 처음부터 onCreate() 부터 실행된다.
콜백이 언제 이루어지고, 언제 어떤 동작을 해야하는지 살펴보자.