본문으로 바로가기

Android 2일차 - 액티비티 생명주기

category Program/Android 2015. 8. 3. 14:14

onCreate()
무조건 Activity가 처음 실행될 때 호출된다. [Case1, Case3]
시스템에 의해 호출되면 인자로 받은 Bundle은 null이다. [Case1]
Activity가 실행된 적이 있는데, 어떤 이유로 종료된 후 재시작되면, 종료될 때 호출된 onSaveInstanceState()에서 저장한 내용과 동일한 Bundle을 넘겨준다.
디바이스가 회전되어 가로/세로 전환 등 리소스를 새롭게 갱신되어야 할 때 호출된다. [Case5]


onDestroy()

Actiivity가 종료되기 전 호출된다.
Activity내부에서 finish()를 실행하면 호출된다. [Case7]
시스템 메모리가 부족하면, 안드로이드가 강제로 TestApp을 죽일 때도 호출이 되는데, 메모리 확보가 매우 시급할 때는 호출조차 되지 않는 경우도 있다.
onCreate()와 짝을 이뤄 사용했던 리소스는 이 곳에서 싹~ 치워준다.


onStart()

Activity가 초기 실행 후, 화면의 전면으로 나타날 때 onCreate(), onRestart() 이후에 호출된다. [Case1, Case4]
전화수신, SMS수신 등으로 Background로 갔다가 다시 전면으로 나올때도 호출된다. [Case2, Case3, Case4]


onRestart()

Activity가 정지되었다가 다시 실행될 때 호출되는데, onDestroy()가 호출된 이후가 아닌, onStop()으로 정지된 상태에만 해당된다. 즉, onStop()과 onRestart()는 한 쌍으로 생각하면 된다. [Case2, Case4]


onStop()

하드웨어 HOME버튼을 눌렀을 때와 SMS수신, 전화수신, 다른 App실행할 때 호출된다. [Case2, Case4]


onResume()

Activity가 전면에 나타날 때 대부분의 상황에서 호출된다. 처음 실행했을 때, onCreate() 이후에도 호출된다.
(책에서는 팝업 대화상자가 떳다가 닫히는 경우에도 호출된다고 하지만, AlertDialog로 테스트 했을 때에는 호출되지 않았다.)


onPause()

거의 모든 경우에 onStop(), onDestroy()가 호출되기 이전에 호출된다.
Activity가 사용자의 시선에서 가려지는 경우에 호출된다고 생각하면 된다.
대부분의 상황에서 onStop() 발생하기 이전에 불린다.
*일반적으로 onResume()과 쌍으로 보고, onResume()에서 했던 작업을 onPause()에서 정리, 멈추는 것이 좋다.
예를 들면, onResume()에서 쓰레드를 실행시켰으면, onPause()가 호출될 때, 아직 쓰레드가 실행중이면 정리를 해주면 된다.
*onPause()가 호출되서 App(또는 Activity)이 일시정지된 상태라면 안드로이드 시스템에서 필요에 따라 완전이 죽일 수 있기 때문에 그 이후의 작업을 못할 수도 있다는 점을 유의해야한다.


onSaveInstanceState()

Activity가 전면에서 Background로 숨는 경우 호출된다. [Case2, Case4, Case5, Case8]
현재의 Activity 상태를 저장하려면 이 함수를 구현한다.
호출될 때, Bundle 인스턴스를 넘겨주는데 이를 이용해서 저장하면 되는데, 예를 들어 에디트박스에 입력된 문자열 등을 저장해 두면 된다.


onRestoreInstanceState()

onSaveInstanceState() 함수에서 저장했던 내용은 onCreate()에서 Bundle 인스턴스로 넘겨받는데, onRestoreInstanceState()에서도 같은 내용을 받을 수 있다.
주의할 점은 onRestoreInstanceState()는 정상적인 상황에서는 호출되지 않는다.
테스트 결과 일반적인 상황이 아닌, 디바이스의 화면회전이 발생할 때[Case5] , 강제종료 후 제시작 할 때[Case6] 발생했다.


onPostCreate() 와 onPostResume()

이 두 함수는 시스템 상에서 마지막 초기화 작업을 목적으로 만들어진 것으로 일반적으로 어플리케이션 작성시에는 구현할 필요가 없다고 한다.
 



 




 

 

특정 엑티비티가 실행되면 onCreate() -> onCreate() -> onStart() -> onResume() -> ... 순서대로 실행이 되고 엑티비티는 동작하게 됩니다.

 

onCreate()는 Activity가 최초 생성할 때 호출됩니다. 초기화 설정을 하는 곳으로 보관된 상태의 Activity가 있으면, 그 상태를 저장중인 Bundle객체를 받아서 사용합니다. onCreate()가 호출된 후에는 onStart()가 호출되는데 이 때에는 강제종료가 불가능합니다.

 

onRestart()는 Activity가 정지된 후(onStop() 후) 다시 시작하기 전에 호출됩니다. onRestart()가 호출된 후에는 onStart()가 호출되는데 이 때에는 강제종료가 불가능합니다.

 

onStart()는 Activity가 사용자에게 보여지기 직전에 호출됩니다. Activity화면을 표시하는 매소드입니다. 이후, onResume()으로 이어집니다. 이 때에는 강제종료가 불가능합니다.

 

onResume()은 Activity가 사용자와 상호작용을 하기 직전에 호출됩니다. 스택의 최상위에 위치하여 Activity를 활성화시키는데, 활성화 상태에 있다가 다른 Activity가 활성화되면 onResume()이 실행됩니다. 실행중 다른 Activity가 활성화되었을 때, 기존 Activity가 화면에 보이면 onPause()에서 처리하고 보이지 않으면 onStop()으로 이어져 처리하게 됩니다. 이 때에도 강제종료가 불가능합니다.

 

onPause()는 다른 Activity가 활성화 되었을 때 호출됩니다. 다시 Activity가 활성화되면 onResume()이 호출되어 Activity를 활성화 하지만, onPause()상태에 있다가 메모리가 부족하면 Process Kill을 하여 메모리를 반환하게 됩니다. onPause()는 Activity화면이 조금이라도 남아있을 때 진행되지만 다른 Activity가 기존 Activity를 가려서 보이지 않게 되면 onStop()을 호출합니다. 이 때에는 강제종료가 가능한데 이 때에는 Process Kill로 종료하는 것입니다.

 

onStop()은 다른 Activity가 Activity를 완전히 가려서 더 이상 보이지 않았을 때 호출됩니다. Activity가 다시 시작되면 onRestart()를 호출하여 onStart() -> onResume()을 통해 활성화됩니다. 이 때에는 강제종료가 가능한데 Process Kill을 통해서 하는 방법과 onDestroy()를 호출하여 종료하는 방법 2가지로나뉘게 됩니다.

 

onDestroy()는 Activity가 삭제되지 직전에 호출됩니다. Activity가 받는 마지막 호출 매소드로 finish()를 호출하여 사용하게 됩니다. 호출된 후에는 Activity가 종료됩니다.