Activity Lifecycle(생애주기)
오늘 배워볼 것은 Activity Lifecycle(생애주기)입니다. 생애주기를 이해하면 어떤 점이 좋을까요?
앱의 동작 이해, 그러니까 액티비티 생애주기를 이해하면 어떤 시점에 어떤 메소드가 호출되는지를 알 수 있습니다. 이를 통해 앱의 동작을 더 잘 이해하고, 필요에 따라 알맞은 시점에 적절한 작업을 수행할 수 있습니다.
안드로이드 앱을 더 효율적으로 개발하고 유지보수할 수 있으며, 액티비티가 일시 중지될 때 사용자 작업을 저장하고, 다시 시작될 때 복원하여 사용자가 이전 상태에서 계속 작업할 수 있도록 지정할 수 있습니다. 안드로이드 스튜디오를 보다 잘 활용할 수 있게 됩니다.
Activity
Activity Lifecycle을 설명하기 앞서, 우선 Activity는 무엇일까요?
안드로이드 Activity는 화면에 표시되는 UI 구성중 가장 기본적인 요소입니다. 안드로이드 앱은 화면에 UI를 표시하기 위해서 최소한 하나의 Activity를 가지고 있어야하며, 앱 실행시 지정된 Activity를 실행하여 사용자에게 UI를 표시하게 됩니다. 그냥 생성하게 되면 안드로이드 템플릿에서 자동으로 Main Activity를 첫화면으로 실행하게 하는데 이를 수정하고 싶으시면 Mainfest에서 코드를 아주 약간 수정해주시면 됩니다.
그리고 액티비티는 기본적으로 일반 코딩파일과 xml이 묶여있어야 합니다. 그것도 메인 코딩에서 확인하실 수 있습니다. setContentView 옆 괄호 안에 있는 레이아웃 ID에 xml이 하나만 지정되어있어야합니다.

Activity는 끊임없이 변환하는 성질을 가지고 있다
Activity는 하나의 화면입니다.
하나의 Activity 화면에 여러 기능을 구현할 수도 있고, 다른 Activity로 화면을 전환시키며 진행할 수도 있습니다. 사람의 생명주기처럼 Activity도 끊임없는 상태변환을 일으킵니다. 일반적인 앱을 생각하시면 됩니다. 앱을 시작하고, 다음화면으로 넘어가고, 이전화면으로 돌아가고, 종료하고.
이런 여러상태의 변환을 일으키는 과정을 Android Lifecycle(생애주기)라고 합니다.
Activity Lifecycle
활동 수명 주기의 단계 간 전환을 탐색하기 위해 Activity 클래스는 6가지 콜백으로 구성된 핵심 집합인 onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()를 제공합니다.
여기에서 특수한 것이 있다면 Activity는 onCreate() 하나만 있어도 구현이 가능하다는 점입니다.
아래는 Activity Lifecycle을 시각적으로 나타낸 것입니다.

0. Activity launch - 액티비티 생성
사용자가 해당 액티비티와 상호작용하면서 앱이 작동하게 됩니다.
1. onCreate() - 액티비티 실행
Activity는 각각의 상태변화를 알아챌 수 있는 Call back(콜백) 메소드를 제공합니다. Activity가 처음 생성할때 on Create()라는 메소드를 자동으로 선언하게 되는데, 그 안에 기능을 넣으면 onCreate()가 선언될떄 자동으로 같이 실행이 됩니다.
이 콜백 메소드는 Activity을 생성한 이후 실행을 하는 메소드이기 때문에 다른 메소드들과 다르게 필수로 구현을 해야합니다.

class HomeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState : Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_home)
//여기부터 기능...
fun(){
}
}
전체 생명주기에는 단 한번만 호출되어야합니다. onCreate() 메소드가 실행되면 activity는 시작된 상태가 되고 자동으로 연달아 onStart()와 onResume() 메소드가 호출됩니다.
2. onStart() - 액티비티 보이기
onCreate()에서 액티비티가 생성이 되면, 그것을 보이게 되는 호출 메소드를 연속적으로 실행하게 됩니다.
이제 액티비티가 사용자에게 보이게 됩니다. 일부러 작성하지 않아도 자동으로 호출됩니다.
위에 이미지를 보시면 아시겠지만 Stop()이후에 화살표가 onStart()로 되돌아가는 것이 보입니다.
이는 onStop()이후에 액티비티를 다시 시작하려면 onCreate이 아니라 onStart을 호출하기 때문입니다.
onStart() 코틀린
override fun onStart() {
super.onStart()
// onStart()에서 데이터 로딩, UI 초기화 등을 수행할 수 있습니다.
}
3. onResume()
액티비티가 보여지는 직후에 호출됩니다. 액티비티가 사용자와 상호 작용할 수 있는 상태가 될 때 호출됩니다.
override fun onResume() {
super.onResume()
// onStart()에서 데이터 로딩, UI 초기화 등을 수행할 수 있습니다.
}
4. onPause()
더 이상 액티비티가 보이지 않습니다. 하지만 완전히 종료되지는 않았고, 잠깐 사라진 것 뿐입니다.
예를 들면 유튜브 앱에 있다가 홈버튼을 누른것입니다. 하지만 나중에 내역을 확인하면 유튜브가 아직 꺼지지 않고 실행되는 것을 확인할 수 있습니다.
override fun onPause() {
super.onPause()
// onStart()에서 데이터 로딩, UI 초기화 등을 수행할 수 있습니다.
}
5. onStop()
액티비티가 활동을 종료하고 있습니다.여기에서 액티비티를 다시 호출하려면 onRestart()가 필요합니다.
override fun onStop() {
super.onStop()
// onStart()에서 데이터 로딩, UI 초기화 등을 수행할 수 있습니다.
}
6. onDestroy()
액티비티가 소멸되기 직전에 호출됩니다.
override fun onDestroy() {
super.onDestroy()
// onStart()에서 데이터 로딩, UI 초기화 등을 수행할 수 있습니다.
}
7. Activity shut down (액티비티 완벽하게 종료)
이로서 안드로이드 액티비티 생애주기 설명을 마치겠습니다.
Activity Stack
액티비티 스택은 이러한 액티비티들의 관계를 관리하고, 사용자가 뒤로가기 버튼을 누르거나 화면 전환을 요청할 때마다 해당 스택에서 액티비티를 팝(pop)하거나(push)하는 방식으로 작동합니다.
스택은 후입선출의 구조를 가졌습니다. 새로운 항목이 스택의 맨 위에 추가되고, 최근에 추가된 항목이 먼저 제거되는 구조입니다. 따라서 액티비티 스택에서는 사용자가 현재 화면에서 뒤로가기 버튼을 누를 때마다 스택의 맨 위에서 가장 최근에 추가된 화면이 제거되고 이전 화면이 보여지는 것입니다. 그리고 다시 앞으로 되돌아갈 수 없습니다. 이미 되돌려진 화면이 삭제되었으니, 뒤로 계속 돌아갈 수는 있어도 앞으로 못 돌아옵니다.
스택은 스크라는 단위로 관리됩니다. 그리고 각 태스크에서는 백테스크라는 개념이 있는데 액티비티나 프래그먼트가 스택(Stack) 자료 구조 형태로 관리되는 메모리 영역을 의미합니다.
- Single Task (단일 태스크)
- 하나의 액티비티만이 해당 태스크에 속합니다.
- 해당 액티비티가 실행되는 동안, 해당 태스크에 속한 다른 액티비티들은 모두 종료됩니다.
- 새롭게 호출되면, 기존에 있는 화면에서 그대로 액티비티가 시작됩니다.
- 간혹 크롬이 화면을 꺼도 다시 키면 그대로 브라우저가 남은 것처럼 비슷합니다.
- Single Instance (단일 인스턴스)
- 단일 인스턴스 태스크는 단일 태스크와 유사하지만, 태스크는 독립적인 인스턴스로 존재합니다.
- 이 태스크에 속한 액티비티가 단 하나만 존재하며, 그 이외의 액티비티는 다른 태스크에 속해야 합니다.
- 단일 인스턴스가 열려있는 상태에서 동일한 액티비티를 호출하면, 해당 액티비티가 이미 존재하는 태스크에서 새로 띄워지지 않고 새로운 인스턴스로 생성됩니다.
- 이는 마치 앱 브롤스타즈와 비슷하게 한번 잠깐 꺼지면, 액티비티가 처음부터 다시 시작합니다.
- Single Top (단일 최상단)
- 단일 최상단 태스크에서 실행 중인 액티비티를 새로 시작할 때, 해당 액티비티가 이미 최상단에 있는 경우에는 액티비티를 재사용합니다.
- 최상단에 있는 액티비티가 아니라면 새로운 인스턴스가 생성됩니다.
- 이는 아까 말했듯이 후입선출의 구조를 지녔기 때문에 얻을 수 있는 특성입니다.
- Standard (표준)
- 표준 태스크는 새로운 액티비티 인스턴스를 항상 만듭니다. 새로운 인스턴스는 백스택에 추가되고 사용자가 백스택에서 액티비티를 백 버튼을 사용하여 백스택에서 제거할 수 있습니다.
액티비티 스택과 생애주기의 연관성?
이 둘은 아주 긴밀한 연관성이 있는데, 왜냐하면 액티비티는 시스템에서 자동적으로 백스텍에 저장하기 때문입니다.
자동으로 백스택에 정보를 넘기기 때문에 액티비티는 굉장히 편리한 방식으로 정리할 수 있게됩니다.
Fragment 생애주기
생애주기는 액티비티에만 존재하지 않고, 프래그먼트에도 생애주기가 있습니다. 우선 프래그먼트는 무엇일까요?
안드로이드 프래그먼트(Fragment)는 액티비티 내에서 독립적으로 관리되는 UI 모듈입니다. 프래그먼트는 자체 생명주기를 가지고 있으며, 액티비티의 생명주기와 밀접하게 관련되어 있습니다. 프래그먼트의 주요 생명주기 메서드는 다음과 같습니다.

- onAttach()
프래그먼트가 액티비티에 연결될 때 호출됩니다. 프래그먼트가 액티비티에 연결되기 전에 호출됩니다. - onCreate()
프래그먼트가 생성될 때 호출됩니다. 여기서 초기화 작업을 수행할 수 있습니다. - onCreateView()
프래그먼트의 뷰가 생성될 때 호출됩니다. 여기서 프래그먼트의 레이아웃을 초기화할 수 있습니다. - onActivityCreated()
프래그먼트가 속한 액티비티의 onCreate()가 완료된 후 호출됩니다. 여기서 액티비티와의 상호작용을 시작할 수 있습니다. - onStart()
프래그먼트가 사용자에게 보여지기 직전에 호출됩니다. - onResume()
프래그먼트가 화면 상단에 표시되고 사용자 입력을 받을 수 있는 상태가 되었을 때 호출됩니다. - onPause()
프래그먼트가 포커스를 잃고 더 이상 사용자 입력을 받지 않을 때 호출됩니다. - onStop()
프래그먼트가 더 이상 사용자에게 보여지지 않을 때 호출됩니다. - onDestroyView()
프래그먼트의 뷰가 제거될 때 호출됩니다. - onDestroy()
프래그먼트가 소멸될 때 호출됩니다. - onDetach()
프래그먼트가 액티비티에서 분리될 때 호출됩니다.
프래그먼트 생명주기는 액티비티의 생명주기와 유사하지만, 일부 차이가 있습니다. 예를 들어, 액티비티의 onPause()가 호출되면 해당 액티비티의 모든 프래그먼트의 onPause()도 호출됩니다. 마찬가지로 액티비티의 onStop()이 호출되면 해당 액티비티의 모든 프래그먼트의 onStop()도 호출됩니다.
이는 프래그먼트의 데이터 전달 방식이 액티비티와 다르기 때문입니다.
데이터 전달방식?
액티비티의 생애주기와 다른 것은 액티비티와 프래그먼트가 데이터 전달하는 방식이 달라서 입니다.
액티비티는 호출할떄 자동적으로 백스택에 저장합니다. 하지만 프래그먼트는 수동적으로 데이터 백스텍에 저장해야합니다. 트랜잭션을 통해 addToBackStack() 함수를 통해 백스택으로의 저장을 요청해야 합니다.
프래그먼트 생명주기
Attach -> Create -> CreateView -> ActivityCreated -> Start -> Resume -> Pause -> Stop -> DestroyView -> Destroy -> Detach
액티비티 생명주기
Create -> Start -> Resume -> Pause -> Stop -> Destroy
그렇기떄문에 액티비티가 코딩하기 쉬운 것같습니다.
오늘은 이만 마치겠습니다. 좋은 하루 되세요!
'안드로이드 스튜디오' 카테고리의 다른 글
[안드로이드 스튜디오] 프로필 사진 등록 기능 (1) | 2024.04.09 |
---|---|
안드로이드 스튜디오 Intent(데이터 전송/액티비티 실행) (0) | 2024.03.20 |
앱 기획안 작성 피그마 (피그마 기초 + 개인기록용 앱기획안) (5) | 2024.02.26 |
안드로이드 스튜디오 Fragment(프래그먼트) (0) | 2024.02.23 |
안드로이드 스튜디오 by lazy 코딩 (초기화버튼 만들기) (2) | 2024.01.31 |