웹/모바일 안드로이드 기초

3.2 액티비티 라이프사이클

소개

액티비티는 안드로이드 플랫폼에서 동작하는 컴포넌트중 하나 입니다. 따라서 개발자가 아닌 시스템에 의해 객체가 생성되고 종료되는 일련의 과정을 거치게 됩니다. 이러한 과정을 라이프 사이클(생명주기, 수명주기)이라고 하며 액티비티 상태의 변화로 이해할 수 있습니다.

2.사용자 인터페이스에서 살펴본것 처럼 스마트폰의 화면을 세로방향으로 전환하는 경우에도 액티비티의 상태변화가 발생하며 별도의 작업이 없다면 화면상의 데이터가 초기화되는 현상을 경험한 적이 있습니다.

따라서 액티비티의 라이프사이클에 대한 이해는 필수적이고 각 상태에 따른 코드를 적절히 구현하지 않으면 앱이 정상적으로 동작하지 않기 때문에 중요하다고 할 수 있습니다.



액티비티 라이프사이클

액티비티 인스턴스는 라이프사이클 안에서 서로 다른 상태를 통해 전환됩니다. 액티비티 클래스는 상태변화에 따라 호출되는 콜백 메서드를 포함하고 있습니다. 즉, 개발자는 액티비티의 여러 상태변화에 앱이 의도한대로 동작할 수 있도록 필요한 콜백 메서드를 오버라이딩해서 구현할 필요가 있습니다.

액티비티의 상태변화는 액티비티를 이동할때 발생하며 다음과 같이 두개의 액티비티를 전환하는 경우를 생각해 볼 수 있습니다.

[그림: 액티비티 전환시 상태 변화], 출처:https://developer.android.com


라이프사이클과 콜백 메서드

안드로이드 시스템은 액티비티 전환시 상태변화에 따른 콜백메서드를 제공하고 있습니다. 주의할점은 이러한 상태변화가 앱을 기준으로 하는것이 아니라 각각의 액티비티에 발생한다는 점입니다. 따라서 하나의 앱이 여러 액티비티로 구성될 경우 각각의 액티비티에서 필요한 콜백을 적절히 구현해 주어야 합니다.

물론 액티비티 동작에 상관없는 경우라면 모든 콜백 메서드를 구현해줄 필요는 없습니다.

다음 그림은 액티비티 상태와 상태전환간에 발생하는 콜벡 메서드를 보여줍니다.

[그림: 액티비티 상태와 콜백], 출처:https://developer.android.com

onCreate()

액티비티가 생성될때 onCreate() 메서드가 호출됩니다. 이 메서드는 필수적으로 구현해 주어야 하며 액티비티가 생성되면 Created상태가 됩니다.

Created상태는 onCreate() 메서드가 실행중인 동안만 유지되며 실행이 완료되면 Started상태로 전환되며 onStart()onResume()메서드가 차례로 호출됩니다.

일반적으로 액티비티생성시 수행하는 작업들은 다음과 같습니다.

매개변수로 전달되는 savedInstanceState 는 액티비티의 이전 상태가 저장된 Bundle 객체이며 새로 생성된 경우 null이 됩니다.

onStart()

액티비티가 Created상태가 되면 onStart() 메서드가 호출 되며 Started상태로 전환 됩니다.

onCreate()는 생성시 한번만 호출되지만 onStart()는 백버튼이나 업버튼에 의해 이전 액티비티로 돌아가는 경우 다시 호출되게 됩니다.

콜백메서드 수행 완료시 resumed(running)상태가 되며 onResumed() 메서드가 호출 됩니다.

onResume()

액티비티가 포그라운드에 표시되고 화면에 UI가 나타나며 Resumed상태가 됩니다. 즉 onCreate() 에서 setContentView() 호출을 통해 화면을 구성 하더라도 실제 화면이 보이는 시점은 onResume() 메서드가 호출된 이후 입니다.

기본적으로 앱은 Resumed상태를 유지하며 전화가 오거나, 사용자에 의해 다른 액티비티로 이동하거나 화면이 꺼지는등의 이벤트가 발생하기전까지 머무르게 됩니다.

이러한 이벤트 발생시 액티비티는 Paused로 들어가게되고 시스템은 onPause() 메서드를 호출하게 됩니다.

onPause()

액티비티를 떠날때 첫번째 신호로 이 메서드를 호출 합니다. 기본적으로 액티비티가 포그라운드에 있지 않게 된다는 것을 의미하며 Paused 상태가 됩니다. 멀티 윈도우 모드에서는 화면에 계속 보일수도 있습니다.

onResume 에서 살펴본것 처럼 특정 이벤트 발생시 호출되는 것이 가장 일반적인 경우이며 멀티 윈도우 모드에서 특정 앱이 활성화된 경우 다른 앱은 화면에는 보이지만 일시정지 상태가 됩니다.

액티비티가 완전히 화면에서 보이지 않게 되었을때 onStop() 을 호출하게 됩니다.

onStop()

액티비티가 화면에서 완전히 사라지고 새로운 액티비티가 표시 완료 되었을때 호출 되며 Stopped 상태가 됩니다. 액티비티를 명시적으로 종료하는 경우에도 onStop()이 호출될 수 있습니다.

여기에서는 앱이 보이지 않는 동안 필요없는 리소스를 해제하는등의 작업이 필요합니다. 예를들어 데이터베이스에 데이터를 저장하거나 세밀한 위치 업데이트에서 대략적인 위치 업데이트로 전화 혹은 애니메이션의 일시정지 등이 해당 됩니다.

액티비티 객체는 아직 메모리상에 존재하는 상태이며 레이아웃에 있는 각 View 객체의 현재상태(예를 들어 입력된 값)로 저장되어 있기 때문에 이를 저장이나 복원할 필요가 없습니다.

액티비티가 다시 시작되면 onRestart()를 호출하게 되고 실행을 종료할 경우 onDestroy()를 호출하게 됩니다.

onDestroy()

액티비티가 완전히 소멸되기 전에 호출되며 Destroyed 상태가 됩니다.

액티비티 상태 변화 예시

앱 구성

앱실행

A -> B

B -> A : Back 버튼 혹은 finish()



상태 저장과 복구


실습 및 참고자료

실습: 두개의 화면으로 구성된 앱을 통해 액티비티와 인텐트의 동작을 이해하기 위한 예제

메인 액티비티 이외의 액티비티를 가지는 앱을 만들고 명시적, 암시적 액티비티 호출을 통해 액티비티간 화면 전환과 데이터 교환 방법을 실습 합니다.

본 예제는 다음과 같은 내용들을 학습하기 위한 내용으로 구성 됩니다.

프로젝트 준비

실행 결과

따라하기 및 코드 설명

유튜브 동영상 강좌를 참고해 주세요


참고자료