×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 2,312,121명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)
반응형

안드로이드 Activity Lifecycle

 

 

액티비티 생성시 onCreate, onStart, onResume 메소드가 차례대로 호출된다.

그리고 화면이 없어지는 과정에서 onPause, onStop, onDestroy 메소드가 순서대로 호출된다.

 

 

Activity의 3가지 상태

 

(1) 활성화(Active) 또는 실행 중 (Running) 상태

 

- Activity가 전면에 나와서 실행되고 있을 때

- 현재 Task에 대한 Activity Stack의 최상위에 존재하고 있을 때

- 이 상태의 Activity는 사용자의 초점을 가지고 있다.

 

(2) 멈춤 (paused) 상태

 

- 사용자의 초점을 가지고 있지 않지만 여전히 사용자에게 화면이 보여지고 있을 때

- 즉, 다른 Activity가 그 위에 위치하지만 그 Activity가 투명상태 또는 전체 화면을 채우지 못하고 있어서 아직은 약간이라도 Activity를 볼 수 있는 상태

- 이 상태의 Activity는 모든 상태 정보와 리소스 등을 유지하고 있지만, 극도로 메모리가 부족한 상태에서는 시스템에 의해 강제로 종료될 수 있다.

 

(3) 정지 (Stopped) 상태

 

- 다른 Activity에 의해서 완전히 가려져, 더 이상 사용자에게 보여지지 않을 때

- 이 상태의 Activity는 여전히 모든 상태 정보와 리소스 등은 유지할 수 있다.

- 그러나 멈춤 상태와 마찬가지로 극도로 메모리가 부족한 상태에서는 시스템에 의해 강제로 종료될 수 있다.

 

 

① onCreate() 

 

- Activity가 생성되어 시작될 때 처음으로 호출되는 메소드

- Activity의 리소스 초기화, 레이아웃 및 데이터 바인딩 등의 초기 설정 작업 수행

- onCreate() 메소드에서는 Bundle 객체를 매개변수로 받아오는데, 새로 시작된 Activity의 경우 null 값이 전달됨.

- 그러나 해당 Activity가 멈춤이나 정지상태에서 메모리 상의 이유로 강제로 종료되었다가 다시 시작하는 경우라면, 이 Bundle 객체에는 해당 Activity의 이전 상태 정보가 들어있을 것이며, 이 정보를 이용해서 이전 상태로 복원할 수 있다.

 

 

② onStart()

 

- Activity가 사용자에게 화면을 보여줄 준비가 되었을 때 호출되는 메소드

- 주로 사용자에게 Activity를 보여주기 위해 필요한 리소스들을 설정함.

 

③ onResume()

 

- Activity가 Activity Stack의 최상위에 놓여서 사용자에게 화면을 보여주고 사용자의 입력을 처리할 수 있을 때 호출되는 메소드

- 오디오나 동영상, 애니메이션 등과 같이 화면 맨 앞에서 실행되고 있을 때만 필요한 리소스들을 설정하기 좋은 메소드

 

④ onPause()

 

- Activity가 사용자 초점을 잃었을 때 호출되는 메소드

- onResume()에 대응되는 한 쌍의 메소드

- onResume() 메소드가 호출된 후 onPause() 메소드가 호출되기 까지를 포어그라운드 라이프사이클(Foreground Lifecycle)이라고 부른다.

- onResume() 메소드에서 설정했던 리소스들은 반드시 onPause() 메소드에서 해제해야 한다.

예) onResume() 메소드에서 재생을 시작한 오디오나 동영상, 애니메이션을 중단해야 하고, DB와 같은 리소스들도 해제해야 함.

 

⑤ onStop()

 

- 다른 Activity가 Activity Stack의 최상위에 놓이면서, 현재 Activity는 더 이상 화면에 보이질 않게 될 때 호출되는 메소드

- onStart() 메소드에 대응되는 한 쌍의 메소드이며, onStart() 메소드가 호출된 후 onStop() 메소드가 호출되기까지를 비저블 라이플사이클(Visible Lifecycle)이라고 부른다.

- onStart() 메소드에서 설정했던 리소스들(사용자에게 Activity를 보여주기 위해 설정한 리소스들)은 반드시 onStop() 메소드에서 해제해야 한다.

 

⑥ onRestart()

 

- Activity가 더 이상 화면에 보이지 않게 되었다가 다시 화면을 보여줘야 할 때 호출되는 메소드

- onStart()가 호출되기 전에 필요한 설정 작업을 수행함.

 

⑦ onDestroy()

 

- Activity가 파괴되기 전에 호출되는 메소드

- onDestroy() 메소드가 호출되는 경우 

> Activity가 스스로 종료하려고 하는 경우

> 메모리 부족으로 안드로이드 플랫폼이 Activity를 강제로 죽이려 하는 경우

 

https://hyeonstorage.tistory.com/149

 

 

 

 

Lifecycle이 필요한 이유

안드로이드 내에서 라이프사이클이 없다면, 내가 어떤 액티비티에서 다른 액티비티로 전환(화면 전환)이 이루어질 때 보이지 않는 액티비티까지 계속 메모리에 올려두게되면 결국 Memory overflow 혹은 Memory leak이 발생할 가능성이 높다.

 

즉, 현재 내가 보고 있지 않는 화면을 안드로이드 OS에서 유지해줄 필요는 없는 것이고, 이를 관리하기위해 Activity Lifecycle이 생겨나게 된 것이다.

 

 

 

 

데이터의 복구

 

앞서 말했듯이 Lifecycle을 만듦으로써 사용자가 입력했던 데이터를 복구하거나 상태 정보를 복구할 수 있다.

 

화면이 없어질 때 데이터를 임시로 저장해두었다가 화면이 다시 보일 때 복구할 수 있어야 하는데

이때 사용되는 메소드가 onPause와 onResume이다.

 

onPause 메소드는 화면이 눈에서 보이지 않게 될 때 항상 호출되므로 이때 데이터를 저장할 수 있다.

(SharedPreferences Object 같은 것들로 저장이 가능하다.)

onResume 메소드는 화면이 다시 보일 때 항상 호출되므로 이때 저장해 둔 데이터를 가져와 화면에 설정할 수 있다.

 

이 방법 이외에도 onSaveInstanceState 메소드와 onRestoreInstanceState 메소드를 사용하는 방법도 있다.

액티비티가 중지되기 전에 onSaveInstanceState 메소드가 호출되는데 이 안에서 임시로 데이터를 저장할 수 있다.

 

반응형