안드로이드는 에서 Activity와 Fragment의 lifecycle(생명주기)에 맞추어 개발을 하는 것이 매우 중요한데요.

오늘은 Activity와 Fragment의 생명주기에 관해서 정리해보겠습니다.



1. Activity 생명주기


먼저, Activity에 대해서 정리해볼텐데요,

아래 이미지를 보시면서 전체 흐름에 대해서 보고, 

하나씩 정리해보도록 하겠습니다.



1-1. OnCreate ()


액티비티가 Launch되고 나서, 최초에 실행될 때, 호출 됩니다.

액티비티에 필요한 리소스들을 여기서 초기화 해주는데요.

Button이라든가 EditText를 예로 들 수 있겠습니다.



1-2. OnStart ()


유저에게 액티비티가 보이도록 해주는데요.

이 단계는 매우 빠르게 끝나고, onResume() 상태로 들어갑니다.


보통 BroadcastReceiver는 이 단계에서 등록을 하는것이 좋습니다.



1-3. OnResume () 와 OnPause()


제 생각에, 안드로이드 개발에 있어서 꼭 알아야 하는, 매우 중요한 단계 두가지입니다.

OnResume 단계에서, Activity는 foreground로 나와서, 유저와 인터랙션을 하게 되는데요.


이 때, 유저에게 전화가 오거나, 다른 액티비티로 이동하면, OnResume()에 있던 activity는,

OnPause()를 호출하게 됩니다.

그러다가 유저가 다시 해당 activity로 돌아오면, 이번에는 다시

OnResume()을 호출합니다.


즉, Foreground로 나오면, OnResume을 호출하고, 다른 액티비티가 Background로 나오게 되면, OnPause를 호출하는 것인데요.

OnResume에서는, Camera리소스 같이 화면이 포커스를 가지고 있는 경우에만 사용할 리소스들을 초기화 해주고,

OnPause에서, 해제해 주어야 합니다.


생각보다 OnResume과 OnPause에서 리소스를 초기화하고, 해제해주어야 하는 경우가 많습니다.

BroadcastReceiver를 동적으로 생성했거나, SensorManager로 GPS를 사용하거나 하는 경우에는,

OnPause시에 리소스를 해제해 주면, 배터리소모를 막을 수 있기도 합니다.


한가지 주의할 점은, 

OnPause에서  데이터를 저장하거나, 네트워크를 호출하고, 데이터베이스를 실행하면 않된다는 것입니다.

안드로이드 가이드에서는, onPause가 위의 과업들을 수행할 만큼의 충분한 시간을 가지지 못한다고 합니다.

이런 무거운 과업들은 onStop에서 행하라고 하는 군요.



1-4. OnStop()


OnPause에서의 시간은 매우 짧습니다. 유저에게 다른 Activity가 보이고, 더이상 해당 Activity가 화면에서 보이지 않게되면,

OnStop이 호출됩니다. 

이 단계에서는, Activity Object가 메모리에만 남아있고, window manager에서는 attach되어있지 않아서, 

데이터가 있다면 다시 복원할 수 있는 상태입니다.


OnStop에서 유저가 다시 해당 액티비티로 돌아오게 되면,

OnRestart()를 거쳐서, OnStart()가 호출되게 됩니다.

하지만, 유저가 Activity를 finish()하거나(안드로이드 하단의 세모 버튼), 시스템이 메모리 부족으로 해당 액티비티를 finish()시킨다면,

onDestroy()를 호출하고 사라집니다.


참고로, 시스템은 OnStop()상태에 들어서면, onSaveInstanceState()이라는 메소드를 호출하는데요.

이 단계에서 key-value형태로 값을 저장할 수 있고, 이 값은 OnCreate()에서 복원할 수 있습니다.

이 부분에 관해서는 다른 글로 정리해보겠습니다~.



1-5. OnDestroy() 


OnStop()단계에서, 시스템이 메모리가 부족하여 시스템이 액티비티를 finish 하거나,

유저가 액티비티를 finish하는 경우, 혹은

프로그램적으로 activity를 finish()시키는 경우 OnDestroy가 호출됩니다.


한가지 알아둬야 할 점은, 안드로이드에서 세로화면에서 가로화면으로 전환시키는 것은,

내부적으로는 현재의 Activity를 OnDestroy()를 호출하고, 다시  OnCreate()를 호출한다는 것입니다.



2. Fragment 생명주기


아래 표에 Fragment의 생명주기를 나열해놓았는데요.

뭔가 많아 보이지요?

Fragment자체가 Activity안에서 존재하게 되므로, Activity의 존재와도 연관된 생명주기들을 추가적으로 가지고 있기 때문인데요.

하나하나 정리해 보겠습니다.


2-1. OnAttach ()


Fragment가 Activity에 attach될 때 호출됩니다.

코드적으로 재미있는 것은, 호출되면서 인자로 context가 주어진다는 점입니다.

이 context를 가지고, 부모 액티비티에 lisnter interface를 implement했다면,

형변환을 해서, 아래와 같이 가져올 수 있습니다.




2-2. OnCreate()


액티비티와 마찬가지로 초기화해야하는 리소스들을 여기서 초기화 해줍니다.

프래그먼트를 생성하면서 넘겨준 값들이 있다면, 여기서 변수에 넣어주면 됩니다.


하지만, 주의해야 할 점은, 여기서 UI 초기화는 할 수 없다는 점입니다.

UI초기화는 다음단계에서 해줍니다.




2-3. OnCreateView()


Layout을 inflate하는 곳인입니다.  view객체를 얻을 수 있으므로,

여기서 View와 관련되서, 버튼이나 EditText, TextView등을 초기화 할 수 있습니다.



2-4. OnActivityCreated()


Fragement에서의 OnCreateView를 마치고,

Activity에서 onCreate()가 호출되고 나서 호출되는 메소드입니다.

Activity와 Fragment의 뷰가 모두 생성된 상태로,

View를 변경하는 작업이 가능한 단계입니다.



2-5. OnStart()


Activity에서의 역할과 비슷합니다.

유저에게 Fragment가 보이도록 해줍니다.

Activity는 이단계에서는 started상태입니다.


2-6. OnResume()


이부분도 Activity와 비슷한데요.

유저에게 Fragment가 보여지고, 유저와 상호작용이 가능하게 되는 부분입니다.



2-6. OnPause(), OnStop()


OnPause에서 OnStop으로 가는 단계도, 액티비티의 생명주기와 유사한데요.

프래그먼트의 부모 액티비티가 아닌, 다른 액티비티가 foreground로 나오게 되면,

OnPause()를 콜하구요 Backstack으로 들어가게 됩니다.


다른 액티비티가 화면을 완전히 가리게 되면, 

onStop()을 호출하게 됩니다.

onStop에서 프래그먼트는 액티비티의 다른 데이터들과 마찬가지로,

유저가 다시 해당 액티비티를 호출하면 다시 복원될수 있는 상태입니다.



2-6. OnDestroyView()


메소드의 이름에서도 알수있겟지만, 

프래그먼트와 관련된 View가 제거되는 단계입니다.


2-6. OnDestroy()


프래그먼트는 생성될 때, onCreate-> onCreateView로,

초기화할 리소스들과, 초기화할 뷰를 순서대로 호출했는데요.

Destroy할 때는, 반대로 OnDestroyView에서 View를 제거하고,

OnDestroy()를 호출합니다.



2-6. OnDetach()


프래그먼트가 액티비티로부터 해제되어질때 호출됩니다.



이렇게 해서, Activity와 Fragment의 생명주기에 대해서 정리해보았는데요.

onSaveInstanceState 이나 BackStack같은 부분에 대해서는 다른 글에서 좀더 정리해보겠습니다~.


+ Recent posts