[ 앱 개발자 도전기 : 안드로이드 ]
안드로이드의 Activity LifeCycle ( 액티비티 생명주기 )
∇ 안드로이드 Activity LifeCycle
목 차
1. 생명주기란?
2. 생명주기 메서드
3. Activity 상태 및 메모리에서 Killed
4. 예제.
◎ Lifecycle은 Life + cycle의 합성어 == 삶의 순환
== 말 그대로, 탄생하고 성장하여 죽음에 이르기까지의 과정.
◎ 이것을 안드로이드 앱에 적용한 것이 바로 Android Lifecycle
- Activity , Fragment, Service 총 3가지 종류의 Lifecycle이 있으며 이번 글에서는 Activity의 Lifecycle 에대해서.
1. 생명주기(LifeCycle)란?
※ 유저가 앱을 사용하다가,
앱을 나가거나 - 나갔다가 다시 돌아오는 경우에는
Activity 인스턴스는 수명주기안에서 "상태"가 바뀌게 됩니다.
○ Activity 클래스에서는 액티비티가 상태 변화를 알아차릴 수 있는 Callback을 제공합니다.
○ "상태 변화란"
: 안드로이드 앱이 실행된 후, 다른 액티비티 화면으로 전환되거나 , 화면이 꺼지는 경우,
폰-상태바를 내려서 액티비티가 가려지는 경우 혹은 앱이 종료 될 때 등등.
● 이러한, "상태 변화"가 있을 때마다,
화면에 보이는 액티비티의 생명주기 메서드를 호출해서 상태 변화를 알려줍니다.
◇ 유저가 액티비티를 벗어났다가 다시 돌아왔을 때,
액티비티가 작동하는 방식을 생명주기 메서드에서 선언 가능합니다.
ex) 프리미어를 사용하지 않는 유저가 넷플릭스 동영상 플레이어 사용 중 .
: 유저가 다른 앱으로 전환할 때 동영상 일시중지, 네트워크 연결 종료,
다시 돌아오면 네트워크를 다시 연결, 일시중지했던 지점에서 다시 동영상 시작.
◇ 생명주기 콜백을 잘 구현함으로써, 예방할 수 있는 문제들.
- 사용자가 앱 사용 중 전화가 오거나, 다른 앱으로 전환할 때 비정상 종료되는 문제.
- 사용자가 앱을 활발하게 사용하지 않는 경우, 시스템 리소스가 소비되는 문제
- 앱에서 나갔다가 나중에 돌아왔을 때 이전 진행상태가 저장되지 않는 문제
- 화면이 가로 방향과 세로 방향 으로 회전할 때
비정상 종료되거나, 사용자의 진행 상태가 저장되지 않는 문제
2. 생명주기 메서드
▽ 생명주기 호출 Case.
- 액티비티 인스턴스를 생성함과 동시에 생성 관련 생명주기 메서드가 순차적으로 호출됩니다.
- 종료시에도, 소멸과 관련된 생명주기 메서드가 순차적으로 호출됩니다.
§ 액티비티 생성시
☆ onCreate() : 생성된 화면 요소를 메모리에 로드
☆ onStart(), onResume() : 화면의 요소를 나타내고 유저와 상호작용 시작(Resumed 상태)
§ 액티비티를 화면에서 제거
☆ onPause(), onStop() - >> 뒤로 가기, finish()를 실행할 때 동시 실행
☆ onDestroy() ->> 최종적으로 액티비티가 메모리에서 제거됨.
§ 액티비티를 종료하지 않고 다른 액티비티 실행.
☆ onPause(), onStop() - >> 현재 액티비티를 종료하지 않고 새로운 액티비티가 만들어 질 때
( Stopped 상태 )
☆ onStart(), onResume() - >> 두 메서드가 연속적으로 실행되고, Resumed 상태로 변경.
§ 액티비티를 종료하지 않거나, 액티비티가 모두 가려지지 않을 때 다른 액티비티 실행.
☆ onPause() - >> 완전히 사라진 것은 아니므로, ( Paused 상태 )
☆ onResume() - >> 정지한 것이 아니므로, onStart()를 거치지 않고 바로 onResume()으로,
( Resumed 상태 )
▽ 생명주기 메서드를 디테일하게 알아봅시다.
1) onCreate()
● 시스템이 먼저 액티비티를 생성할 때 실행되고, 필수적으로 구현해야 합니다.
● 액티비티가 생성되면 상태는 ( Created ) 된 상태,
액티비티의 전체 생명주기 통틀어서 단 한번만 발생해야 하는 기본 앱 시작 로직 실행.
● 데이터를 Binding, 액티비티를 ViewModel과 연결, 일부 클래스의 클래스 변수를 인스턴스화.
● savedInstaceState 라는 매개변수를 수신하는데, 이는 액티비티의 이전 저장 상태가 포함된 Bundle 객체.
- 처음 생성된 액티비티라면 Bundle 객체의 값은 null입니다.
● aware component가 있으면, On_Create 이벤트를 수신 --> OnLifeCycleEvent 메서드 호출.
● 따라서 Activity 최초 실행 상황에서 해야하는 작업을 수행하기에 적합함.
☆ XML 파일을 정의하고 setContnetView()에 전달하여 화면에 표기 가능합니다.
- 액티비티 코드에서 새 View 객체를 생성하고,
그 View를 ViewGroup에 넣어서 뷰 계층 구조를 만들수도 있습니다.
==> ViewGroup을 setContentView()에 전달해서 그 레이아웃을 사용합니다.
☆ onCreate() 상태에서 머무르지 않고,
onCreate() 메소드 후 바로 onStart() 와 onResume() 메소드를 실행시킵니다.
2) onStart()
● 액티비티가 Start 상태 - > onStart() 호출.
● 액티비티가 사용자에게 표시되고, 앱의 액티비티를 Foreground에 보내 상호작용하도록 합니다.
● 이 액티비티의 생명주기에 연결된, 모든 생명주기는 ON_START 이벤트를 수신. !
● onCreate와 마찬가지로, 액티비티는 start 상태에 머무르지 않고 이 콜백이 완료되면
액티비티가 onResumed() 메서드 호출, "RESUMED" 상태에 들어갑니다.
3) onResume()
● Activity 가 RESUME 상태에 들어가면, 포그라운드에 표시되고 onResume() 콜백 호출.
● 이 상태에서 앱은 유저와 상호작용. - 특정 이벤트(전화, 다른 액티비티 이동, 화면꺼짐) 전까지 상태 유지.
● 현재 Activity가 사용자에게 '포커스인' 되어있는 상태.
● 개발자는 이 상태에서, 생명주기가 포그라운드에서 사용자에게 보이는 동안 실행해야 할 모든 기능 활성화 가능.
☆ onResume()을 구현하여, onPause() 일 때 해제하는 구성요소를 초기화하고,
Activity가 Resumed 상태로 전활 때 마다 필요한 다른 초기화 작업도 수행해야 합니다.
4) onPause()
● 시스템은 유저가 Activity를 떠날 때의 첫번째 신호로 이 메서드를 호출 ( 항상 Destroyed는 아님)
== Activity 가 화면에 보여지지 않은 직후에 호출.
● 현재 Activity가 포그라운드에 없다는 것을 의미합니다 ( 멀티 윈도우 제외 )
● onPause() 메서드를 사용하여, 액티비티가 paused 상태일 때 실행을 멈추고
잠시 후 다시 시작할 작업을 일시중지하거나 조정합니다.
● 다른 Activit가 호출되기 전에 실행되기 때문에, 무거운 작업을 이어서 수행하지 않도록 주의
● 영구적인 Data는 이곳에 저장.
☆ 액티비티가 Paused 상태에 들어가는 이유.
- 일부 이벤트가 앱 실행을 방해
- 멀티 윈도우 모드에서 보이는 여러 앱 중 포커스를 가진 앱 제외하고, 모두 Paused 됨.
- Dialog 같은 새로운 반투명 액티비티가 열림
( 기존 액티비티가 부분적으로 보이지만, 포커스 상태가 아니면 Paused )
☆ 액티비티가 Paused 상태가 되면 생명주기의 연결된 모든 생명주기-aware component가
ON_PAUSE 이벤트를 수신. 구성요소가 포그라운드에 있지 않을 때 실행할 필요가 없는 기능을 모두 정지.
☆ 부하가 큰 작업은 onStop() 상태일 때에 실행되어야 합니다.
☆ 액티비티가 완전히 보이지 않게 되면 onStop() 호출.
5) onStop()
● Activity가 다른 Activity에 의해서 100% 가려질 때 호출되는 메소드.(stop상태)
- 액티비티가 Stop 상태로 전환하면, 화면에 보이지 않을 때 실행할 필요가 없는 기능을 모두 정지.
● onStop() 메서드에서는 앱이 사용자에게 보이지 않는 동안 앱은 불필요한 리소스를 해제하거나 조정 !
- ex) 애니메이션을 일시중지 // 세밀한 위치 업데이트 -> 대략적인 업데이트.
● onPause() 대신 onStop()을 사용하면, 사용자가 멀티 윈도우 모드에서 액티비티 보여도 UI 관련 작업 계속.
● 액티비티가 Stop 상태게 들어가면 - > Activity 객체는 메모리 안에 머물게 됨.
- > 액티비티가 다시 시작되면, 이 정보를 다시 호출 !
☆ 최상위 상태가 Resumed 상태인 콜백 메서드 일 때 생성된 구성요소들은 다시 초기화할 필요가 없습니다.
== 시스템은, 레이아웃에 있는 각 View 객체의 현재 상태도 기록합니다.
☆ 액티비티가 다시 시작되면 onRestart()호출, 액티비티가 실행을 종료하면 onDestroy() 호출. !
6) onDestroy()
● Activity가 완전히 소멸되기 전에 호출됩니다.
● 사용자가 액티비티를 완전히 닫거나 finish()가 호출되어 액티비티 종료될 때
● 구성변경(기기회전 | 멀티 윈도우 모드)로 인해 시스템이 일시적으로 액티비티 Destroy 때
이 때 이 액티비티의 생명주기와 연결된 모든 생명주기는 ON_DESTROY 이벤트 수신.
이 때 생명주기 구성요소는 액티비티 destroy 전에 필요한 것들을 정리할 수 있다.
□ 액티비티 Destroy 이유를 결정하는 로직을 입력하는 대신,
ViewModel 객체를 사용해 액티비티의 관련 뷰 데이터를 포함해야 합니다.
□ 액티비티가 구성변경으로 인해서 Destroy 후 Restart하면
ViewModel은 그대로 보존되어 다음 액티비티에 전달되기 때문에 추가 작업이 불필요합니다.
++ 액티비티가 Restart 하지 않으면, ViewModel은 onCleared() 메서드를 호출하여,
액티비티 Destroy 전에 모든 데이터를 정리해야 합니다.
□ onDestroy() 콜백은 이전 콜백에서 아직 해제되지 않은 모든 리소스를 해제해야 합니다.
3. Activity 상태 및 메모리에서 Killed
내부 시스템은 RAM에 여유 공간이 필요하다고 판단하면, 진행중인 프로세스를 Kill 합니다.
- 프로세스의 상태에 따라 다릅니다.
- 시스템은 메모리 공간 확보를 위해서 액티비티를 직접 종료하지 않고 프로세스를 Kill합니다
--> 그러면 자연스럽게 프로세스가 담당하는 모든 액티비티가 Kill됩니다.
'App_Dev > Android' 카테고리의 다른 글
[ 앱 개발자 도전기 : 안드로이드 ] 안드로이드 앱 개발의 특징 정리해보기. (3) | 2024.11.15 |
---|---|
[ 앱 개발자 도전기 : 안드로이드 ] View가 그려지는 순서 (0) | 2024.11.07 |
[ 앱 개발자 도전기 : 안드로이드 ] 안드로이드 4대 컴포넌트 정리. (1) | 2024.11.07 |
[ 앱 개발자 도전기 : 안드로이드 ] 안드로이드 운영체제 부분 정리하기. (4) | 2024.11.05 |
[ 앱 개발자 도전기 : 안드로이드 ] 안드로이드 UI - - 뷰(View)와 XML 레이아웃 기본 구조 (0) | 2024.11.04 |