[Android] - 생명주기
Updated:
Android 생명 주기
유투브는 사용자가 다른 앱을 키거나 전화를 받으면 자동으로 일시정지 되고, 네트워크 연결을 종료시킬 수 있다.
그리고 사용자가 앱으로 돌아갔을 때 다시 네트워크를 연결하고 일시중지한 시점에서 실행할 수 있도록 준비한다.
이렇게 화면의 전환을 안정적으로 처리하려면 어떻게 해야할까?
——-
1. Android 활동 생명 주기의 개념
사용자는 앱을 사용하면서 시스템을 실행하거나 중지하거나 일시중지하는 등 상태를 계속해서 전환하는데,
활동이 실행되고 소멸되기까지의 주기를 활동 생명 주기라고 한다.
액티비티 (Activity)
액티비티 (Activity) 클래스에서는 시스템이 활동을 생성, 중단, 재시작, 활동있는 프로세스 종료 등을 알아차릴 수 있는 여러가지 콜백을 제공하는데
Android 활동 생명 주기의 각 상태 전환마다 적절한 콜백을 구현하게 되면, 앱에서 상태의 변화가 안정적으로 이루어지고 사용자가 앱을 편리하게 사용할 수 있다.
수명 주기 콜백이 잘 구현되지 않을 경우
- 앱 사용 도중 전화가 오거나 다른 앱이 전환되면 비정상 종료되는 문제
- 앱을 활발하게 사용하지 않을 때에도 시스템 리소스가 소비되는 문제
- 앱을 잠시 나갔다가 돌아왔을 때 진행 상태가 저장되지 않는 문제
-
화면이 가로/세로 방향 회전 될 때 앱이 종료되거나 진행상태가 저장되지 않는 문제
2. Android 생명 주기 콜백
onCreate()
- 시스템이 활동을 생성할 때 실행되는 필수 콜백
- 전체 활동생명주기 동안 한 번만 발생.
- ‘생성됨’ 상태에 머무르지 않는다. 메소드가 실행이 완료되면 ‘시작됨’ 상태가 되고 onStart()나 onResume() 메소드를 호출한다.
- 이전 저장 상태가 포함 된 Bundle (savedInstanceState 매개변수) 객체를 수신한다. 처음 생성이면 Bundle 값은 null
onCreate()
- 활동이 ‘시작됨’ 상태에서 호출되는 콜백
- ‘시작됨’상태로 전환하면 연결된 모든 수명주기인식 구성요소는 ON_START 이벤트를 수진
- 활동이 사용자에게 표시되고 앱은 활동을 포그라운드에 보내 상호작용을 준비한다
- ‘시작됨’ 상태에 머무르지 않는다. 메소드가 실행이 완료되면 활동이 ‘재개됨’ 상태에 들어가고 onResume() 메소드를 호출한다.
onResume()
- 사용자와 상호작용하는 ‘재개됨’ 상태에 해당하는 콜백
- 화면에 보여지면서 사용자로부터 어떠한 동작도 받지 않았을 시점에 호출된다
- ‘재개됨’ 상태로 전환하면 연결된 모든 수명주기인식 구성요소는 ON_RESUME 이벤트를 수신
- 방해 이벤트(전화가 오거나 다른 앱으로 이동하거나 화면이 꺼지는 이벤트)가 발행하여 앱에서 포커스가 떠날 때까지 이 상태에 머무른다.
- 방해 이벤트가 발행하면 활동은 ‘일시중지’ 상태에 들어가고 onPause() 메소드를 호출하고 ‘일시중지’ 상태에서 ‘재개됨’ 상태로 돌아오면 시스템이 onResume() 메소드를 다시 호출 ⇒ onResume() 는 onPause() 를 도중에 해제하는 작업을 수행하고, ‘재개됨’ 전환시마다 필요한 다른 작업들도 수행해야함
onPause()
- 사용자가 활동을 떠나는 것을 나타는 ‘활동중지’ 상태에 해당하는 콜백
- 해당 활동이 소멸되는 것은 아니고 활동이 포그라운드에 있지 않는 것을 의미
- ‘활동중지’ 상태로 전환하면 연결된 모든 수명주기인식 구성요소는 ON_PAUSE 이벤트를 수신.
- 포그라운드에 있지 않을 때 실행할 필요가 없는 기능을 모두 정지할 수 있다
- 시스템 리소스, 센서 핸들(GPS) 등 배터리 수명에 영향을 미치는 모든 리소스를 해제할 수 있다.
- onPause() 작업은 아주 잠시 실행되므로 사용자 데이터를 저장하거나 네트워크 호출하거나 트랜잰션을 실행하는 등
부하가 큰 종료작업은 onStop() 상태일 때 실행해야한다 - 활동이 다시 시작되거나 완전히 정지되기 전까지 ‘일시중지’ 상태로 남아 있을 수 있다.
⇒ 활동이 다시 시작되면 onResume(), 활동이 완전히 정지되면 onStop()을 호출한다
onStop()
- 사용자에게 더 이상 표시되지 않는 ‘정지됨’ 상태에 호출되는 콜백
- 다른 활동이 화면 전체를 차지할 경우에 적용
- 앱이 사용자에게 보이지 않는 동안 앱은 필요하지 않는 리소스를 해제하거나 조정해야한다
- CPU를 비교적 많이 소모하는 종료 작업을 실행할 수 있다
- 활동은 ‘정지됨’ 상태에서 다시 시작되어 사용자와 상호작용하거나 실행을 종료하고 사라진다.
⇒ 활동이 다시 시작되면 onRestart(), 실행을 종료되면 onDestroy() 호출
onDestroy()
- 활동이 소멸되기 직전에 호출되는 콜백
-
- 사용자가 활동을 완전히 닫거나, 활동에서 finish()가 호출되어 활동이 종료되는 경우
-
- 구성변경(기기 회전 혹은 멀티 윈도우 모드)으로 시스템이 일시적으로 활동을 소멸시키는 경우
- 활동이 다시 생성되지 않을 경우에는 onCleared() 메소드를 호출하여 활동이 소멸되기 전에 데이터를 정리해야한다
- 활동이 종료되는 경우 onDestroy()는 수신하는 마지막 생명 주기 콜백이 되고,
구성변경으로 onDestroy()가 호출되는 경우 시스템이 즉시 새 활동인스턴스를 생성하여 새로운 구성에서 onCreate()를 호출한다 - 이전 콜백에서 아직 해제되지 않은 모든 리소스(onStop() 등)을 해제해야 한다
참고 목록
활동 수명 주기에 관한 이해
Android 액티비티 생명주기
애플리케이션 수명 주기
안드로이드 액티비티 생명주기(Life Cycle)
Leave a comment