[Android] Android 생명주기와 Task 관리

간단하게 Android의 Activity 라이프 사이클에 대해 정리하고 

그중 onStart()와 onResume()이 구체적으로

어떤 차이가 있는지 알아보고자 합니다.

또한, Task에 관해서도 간단히 공부해보려고 합니다.

 


 

1. Activity LifeCycle

안드로이드를 공부해 봤다면 반드시 한 번쯤 봤을 그림입니다. 바로 Activity 라이프사이클에 대한 그림인데요. 이미 많은 사람들이 잘 알고 있지만, 복습 겸 한번 더 정리해보고자 합니다.

 

onCreate()

액티비티가 생성되는 시점에 실행되며, 전체 생명 주기 동안 한 번만 발생합니다.

보통 OnCreate에서는 XML 파일을 정의하고 setContentView()에 전달하는 대신, 활동 코드에 새로운 View 객체를 생성하고 새로운 View ViewGroup에 넣어서 뷰 계층 구조를 빌드할 수 있습니다. 그런 다음 루트 ViewGroup setContentView()에 전달하여 그 레이아웃을 사용합니다.

 

onStart()

화면에 보이기 시작한 상태이며, 사용자에게 UI가 보이고, 주로 앱이 UI를 관리하는 코드를 초기화합니다. OnStart()는 매우 빠르게 완료됩니다.

 

onResume()

마찬가지로, 화면에 나타나며 실제 액티비티가 실행되고 있는 상태입니다. 앱이 사용자와 상호작용할 수 있고, 어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때까지 앱이 해당 상태에 머물게 됩니다. 

 

onPause()

사용자가 화면을 떠났을 때 첫 번째로 해당 메서드가 호출되며, 활동이 포그라운드에 있지 않다는 것을 의미합니다.

보통 onPause()는 액티비티가 포그라운드에 없을 동안 계속 실행되어서는 안 되지만 언젠가 다시 시작할 작업을 일시중지 하는 작업을 수행합니다. 

주의할 점
onPause()는 아주 잠깐 실행되기 때문에 사용자 데이터 저장, 네트워크 호출 등과 같은 부하가 큰 작업은 안 하는 것이 좋습니다.

 

onStop()

액티비티가 사용자에게 더 이상 표시되지 않으면 STOPPED 상태에 진입하게 됩니다. 즉, 새로 시작된 액티비티가 화면 전체를 차지할 경우에 해당됩니다. 해당 메서드에서는 필요하지 않은 리소스를 해제하거나 조정하는 것이 좋습니다.

액티비티가 STOPPED 상태에 들어가더라도 액티비티 객체는 메모리 안에 머무릅니다. 그런데 시스템이 
더 우선순위가 높은 프로세스를 위해 메모리를 확보해야 하는 경우, 이 액티비티를 메모리 상에서 죽이게 됩니다. 하지만 그럼에도 Bundle에 View 객체 상태를 그대로 저장해 두고, 사용자가 이 액티비티로 다시 돌아오게 되면 이를 기반으로 상태를 복원합니다.

 

onDestroy()

액티비티가 완전히 소멸되기 전에 해당 메서드가 호출됩니다. 

  1. finish()가 호출되거나 사용자가 앱을 종료하여 액티비티가 종료되는 경우
  2. 화면 구성이 변경되어 (기기 회전 등) 일시적으로 액티비티를 소멸시키는 경우

에는 액티비티가 완전히 소멸됩니다.

 

 

2. onStart()와 onResume()의 구체적인 차이

두 메서드에 가장 큰 차이는 유저와 상호작용이 가능한가입니다. onStart()와 onResume() 모두 사용자에게 보이는 상태이나 onStart()의 경우 일부분이나 전체가 보이지 않아도 호출이 가능합니다. onResume에 경우 사용자와 상호작용이 가능하여 UI관련 로직을 정의할 수 있습니다.

 

 

 

3. Task

태스크는 애플리케이션에서 실행되는 프로세스를 관리하는 작업 단위입니다. 그렇다면 안드로이드에서는 이 태스크를 어떻게 관리할까요?

우리는 두 가지 방법으로 관리할 수 있으며, 매니페이스에서 설정하거나 코드를 통해 관리할 수 있습니다.

 

launchMode

안드로이드에서 런치모드를 통해 액티비티가 태스크에 관리되는 방식을 설정할 수 있으며, 호출할 액티비티가 새로 생성할 것인지 재사용할 것인지 결정합니다.

 

  • standard : 가장 기본적인 설명으로 모든 액티비티가 호출될 때마다 태스크에 저장하기 때문에 여러 개가 중첩되어 저장될 수 있다.
  • singleTop : 이미 액티비티가 가장 위에 있을 경우, 액티비티의 인스턴스를 재활용하며 다시 생성되지 않는다. 연속되어 중첩되지는 않지만 태스크에 중복되어 저장될 수는 있다.
  • singleTask : singleTask로 설정된 액티비티가 실행되는 시점에 새로운 태스크를 생성합니다. 이 액티비티가 호출하는 액티비티들은 새로 생성된 태스크에 쌓이게 되며, 다시 호출될 경우 onNewIntent()를 통해 재활용합니다.
  • singleInstance : singleTask와 동일하게 새로운 데스크를 생성하며 다른 액티비티를 호출할 수 없습니다.

매니페스트 설정 외에 인텐트 플래그를 이용하여 호출할 수 있습니다.

  • FLAG_ACTIVITY_NEW_TASK : 새로운 태스크를 생성해서 저장. singleTask와 동일.
  • FLAG_ACTIVITY_SINGLE_TOP : 태스크 가장 위쪽의 액티비티일 경우 재활용. singleTop과 동일
  • FLAG_ACTIVITY_CLEAR_TOP : 액티비티가 태스크에 존재한다면, 그 액티비티 위쪽에 존재하는 모든 액티비티를 제거하고 해당 액티비티를 활성화

🧐만약 매니페스트와 인텐트 플래그 둘 다 동시에 설정하면 어떻게 될까요? 

-> 둘다 설정한 경우 플래그가 더 우선순위가 높습니다.

 

🧐그럼 왜 매니페스트에 작성하는 걸까요?

launchMode를 통해 manifest에 작성하는 경우 해당 액티비티에 대한 기본 동작이 정의되기 때문에 해당 액티비티를 시작할 때 항상 적용됩니다. 하지만, 인텐트플래그를 통해 작성하는 경우 해당 액티비티를 호출하는 시점에 동적으로 launchMode를 설정할 수 있습니다.

 

 

마무리

다시 기본을 알아간다는 마음으로 안드로이드 기본 지식에 대해 다시 공부하는 중인데요! 확실히 다시 공부하니 어떤 차이가 있고, 조금 더 구체적인 개념에 집중하여 공부하게 되는 것 같습니다. 이번 복습 기간을 잘 활용해 제대로 기본 지식에 대해 알아가보고자 합니다! 

 

 

Reference

https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko

https://velog.io/@haero_kim/Activity-Lifecycle-%EC%99%84%EB%B2%BD-%EC%A0%95%EB%B3%B5%ED%95%98%EA%B8%B0