[Android] 안드로이드 앱 우선순위 및 액티비티 생명주기
- 모바일/안드로이드
- 2022. 4. 11.
안드로이드 앱 프로세스
안드로이드 앱은 프로세스로 실행되며 액티비티나 서비스 및 브로드캐스트 수신자 형태의 여러 컴포넌트로 구성됩니다. 모바일이라는 제한적인 환경에서 리소스를 효율적으로 관리하기 위해서는 특히 앱이 실행되는 프로새스와 앱을 구성하는 모든 컴포넌트의 생명주기를 잘 알고 관리해야 하며 앱과 액티비티 생명주기를 반드시 이해해야만 효율적인 앱을 만들 수 있고 앱이 실행하는 동안 다양한 상태와 이벤트에 맞춰서 프로그래밍할 수 있습니다.
안드로이드 우선순위
안드로이드 앱은 안드로이드 운영체제의 별개의 프로세스에서 독립적으로 실행됩니다. 때문에 만약 독립적인 안드로이드 앱이 메모리 한계에 다다를 경우 안드로이드 시스템은 메모리 확보를 위해서 해당 프로세스를 강제로 종료하는 방법을 취합니다. 메모리 확보를 위해서 프로세스를 종료할 때는 특정 순서대로 종료시키는데 이런 우선순위와 상태를 고려해 프로세스들을 정리합니다. 자원을 정리할 때는 우선순위가 낮은 프로세스부터 처리합니다. 포그라운드에 보이는 프로세스가 가장 우선순위가 높습니다.
- 포그라운드 프로세스 - 포그라운드에서 실행되고 있는 액티비티를 가진 프로세스 (가장 마지막에 중단)
- 가시적 프로세스 - 화면에는 보이지만 포그라운드는 아닌 액티비티를 가진 프로세스
- 서비스 프로세스 - 이미 시작되어 현재 실행 중인 서비스를 포함한 프로세스
- 백그라운드 프로세스 - 백그라운드에서 실행되는 액티비티를 가진 프로세스
- 비어 있는 프로세스 - 액티비티 또는 서비스, 브로드 캐스트 리시버를 가지지 않는 Empty 프로세스
액티비티 스택
안드로이드의 액티비티는 스택(Stack) 형태로 관리됩니다. 후입 선출 구조(LIFO)이며 가장 나중에 추가된 액티비티가 스택 가장 상단에 존재하며 안드로이드의 백버튼을 누르면 가장 나중에 추가된 TOP 위치의 액티비티가 제거(POP) 됩니다. 안드로이드 스튜디오에서 Layout Inspector를 실행하면 액티비티의 스택을 가시적으로 볼 수 있습니다. (Tool > Layout Inspector)
액티비티 상태
- 실행(Active/Running) - 스택 최상단 (Top)에 있고 화면에서 볼 수 있는 포그라운드 태스크이며, 사용자와 현재 상호작용하고 있습니다. 시스템 메모리가 부족해도 왠만해서는 중단되지 않습니다.
- 일시 중지(Paused) - 사용자가 화면에서 볼 수 있지만 포커스가 없는 경우입니다. 현재 실행 중인 다른 액티비티가 해당 액티비티를 부분적으로 가려서 포커스를 잃어버린 경우라고 할 수 있습니다. 일시 중지된 액티비티는 메모리에 보전되어 있고, 윈도우 매니저에 연결된 상태이며, 모든 상태 정보를 보존하고 있습니다.
- 중단(Stopped) - 액티비티가 사용자에게 보이지 않는 경우를 말합니다. 일시 중지의 경우 부분적으로 가렸다면 중단의 경우 액티비티 화면 전체를 다른 액티비티가 가렸을 때를 말합니다. 하지만 일시 중지와 달리 메모리가 부족해지면 우선적으로 종료될 수 있습니다.
- 소멸(Killed) - 런타임에서 강제로 액티비티를 종료한 경우를 말하며 액티비티 스택에도 존재하지 않습니다. 때문에 요청이 있으면 새로 액티비티를 만들어서 보여주게 됩니다.
액티비티 스택 관리
액티비티 스택(Stack)을 관리하는 방법은 Intent Flag로 관리하는 방법과 AndroidManifest의 LaunchMode 옵션으로 관리하는 방법으로 2가지로 나뉩니다.
LaunchMode 옵션
standard
- 기본값으로 항상 액티비티 스택을 쌓아 올립니다.
singleTop
- 액티비티의 인스턴스가 이미 태스크의 맨 위에 존재할 경우 새로운 인스턴스를 만들지 않고 onNewIntent() 메서드를 호출하여 기존의 인스턴스를 재활용합니다.
- 주의할 점은 최상위 스택에 있지 않는 액티비티의 경우 그냥 standard 모드처럼 새로운 액티비티가 생성되고 스택에 쌓입니다.
singleTask
- singleTask 모드로 생성된 액티비티는 오직 액티비티 스택 Root에만 존재할 수 있습니다.
- 새로운 태스크 생성 새로운 스택의 루트로써 스택이 쌓이게 됩니다.
- 만일 태스크에 이미 생성되고 singleTask로 설정된 액티비티가 다시 호출된다면 singleTop에서 처럼 액티비티가 재활용되고 이때 동일하게 onNewIntent()가 호출됩니다.
singleInstance
- singleTask와 마찬가지로 항상 새로운 태스크가 생성됩니다.
- 단, 하나의 Task에 하나의 액티비티만 존재할 수 있습니다. (singleTask는 새로운 태스크에 여러 개의 액티비티 스택을 쌓을 수 있음)
Intent Flag 옵션
FLAG_ACTIVITY_NEW_TASK
- singleTask와 유사합니다.
- 활동을 새 작업에서 시작합니다.
- 이미 실행 중인 작업이 있다면 그 작업을 마지막으로 포그라운드로 이동합니다.
FLAG_ACTIVITY_SINGLE_TOP
- singleTop과 유사합니다.
- 새롭게 부른 액티비티가 가장 TOP에 있는 액티비티면 새 인스턴스가 생성되는 기존의 인스턴스가 호출을 수신합니다.
FLAG_ACTIVITY_CLEAR_TOP
- 새롭게 부른 액티비티가 현재 스택에서 실행 중이면 새 인스턴스가 실행되는 대신 해당 액티비티의 스택을 제거하고 새로운 액티비티를 가장 TOP으로 변경합니다.
'모바일 > 안드로이드' 카테고리의 다른 글
[안드로이드] 리스트 뷰(ListView) 사용하기 (0) | 2024.01.17 |
---|---|
[Android] 안드로이드 뷰와 뷰 그룹, 레이아웃 종류 (0) | 2022.04.12 |
[Android] 안드로이드 뷰 바인딩, findViewById (0) | 2022.04.09 |
[Android] 안드로이드 앱의 핵심요소 구성 및 정리 (0) | 2022.03.29 |
[Android] Jetpack 네비게이션 컨트롤러 사용하기 (3) (0) | 2021.05.31 |