[Android] 안드로이드 액티비티 생명주기

명준쓰·2023년 2월 28일
0
post-thumbnail

안드로이드 생명주기에는 액티비티 뿐만 아니라 프레그먼트, 서비스 총 3가지가 존재하는대 오늘은 그 중에 액티비티 생명주기에 대해서 포스팅 해보겠습니다.

액티비티 생명주기에 관해서 정리하기 전에 액티비티란 무엇이고 생명주기란 무엇인지에 대해 간략하게 설명 하겟습니다.

액티비티란 ?

안드로이드 앱은 크게 4가지의 컴포넌트로 구성되는대 그 중 안드로이드 앱의 UI를 담당하는 구성 요소 입니다. 일반적으로 안드로이드 애플리케이션은 하나 이상의 액티비티를 포함하고 있고 각 액티비티는 화면에 사용자 인터페이스를 그리고 사용자와 상호작용하는 로직을 포함합니다.

생명주기란 ?

소프트웨어 개발방법론의 바탕이 되는 것으로, 소프트웨어 개발을 위한 정의, 운용, 유지보수 등의 과정을 단계 별로 나눈 것 입니다.


이제 안드로이드 액티비티 생명주기에 대해 설명하겠습니다.


위 사진은 Android developer 문서에서 제공하는 안드로이드 생명주기에 관한 사진입니다.

먼저 단계별로 간단한 설명을 하고 실제 코드에서 예시를 들어 설명해보겠습니다.

생명주기를 단계별로 정의

onCreate(): 액티비티가 생성될 때 호출됩니다. 이 메서드에서는 액티비티의 초기화를 수행합니다.

onStart(): 액티비티가 시작될 때 호출됩니다. 이 메서드에서는 액티비티가 전면에 나타나기 전에 필요한 초기화 작업을 수행합니다.

onResume(): 액티비티가 활성화될 때 호출됩니다. 이 메서드에서는 액티비티가 사용자와 상호작용할 수 있는 상태가 되도록 UI 초기화를 수행합니다.

onPause(): 액티비티가 일시정지될 때 호출됩니다. 이 메서드에서는 액티비티가 백그라운드로 이동할 때 필요한 상태 저장 작업을 수행합니다.

onStop(): 액티비티가 정지될 때 호출됩니다. 이 메서드에서는 액티비티의 리소스 해제 작업을 수행합니다.

onRestart(): 액티비티가 다시 시작될 때 호출됩니다. 이 메서드에서는 액티비티가 중지된 후에 필요한 초기화 작업을 수행합니다.

onDestroy(): 액티비티가 종료될 때 호출됩니다. 이 메서드에서는 액티비티가 사용한 리소스를 해제하고, 필요한 정리 작업을 수행합니다.


상황별 라이프 사이클 확인

1. 앱을 최초로 실행시킨 경우


앱을 최초로 실행하게 되면 위와 같은 결과를 볼 수 있다. (I/MainActivity 로 필터링 했다)

onCreate() -> onStart() -> onResume() 순으로 실행된다.

1.최초에 한 번 onCreate() 실행
2.앱이 화면에 보이는 시점에 onStart() 실행
3.사용자가 (버튼을 클릭하는 등) 상호 작용을 할 수 있도록 준비된 시점에 onResume() 실행

2. 앱을 실행한 후 닫은 경우


앱을 종료하니 위에서 기록된 onResume 이후로 onPause() -> onStop() -> onDestroy() 순으로 실행된다.

1.사용자가 상호 작용을 할 수 없는 시점에 onPause() 실행
2.앱이 화면에 보이지 않게 되면서 onStop() 실행
3.앱이 메모리에서 해제되면서 onDestroy() 실행

3. 앱을 닫은 후 다시 켠 경우


앱을 다시 열었더니 onCreate() -> onStart() -> onResume() 이 다시 실행된다.

1번 상황과 같은 과정

4. 기기의 홈 버튼을 눌러 앱을 백그라운드로 보낸 경우


앱을 아예 껐을 때와 다르게 onDestroy()가 실행되지 않고 onPause() -> onStop() 이 실행된다.

1.액티비티가 포커즈를 잃으면서 onPause() 실행
2.화면에 더 이상 보이지 않게 되면서 onStop() 실행
3.아직 백그라운드에 있으면서 메모리를 차지하고 있기 때문에 onDestroy()는 실행되지 않음
4.그러나 이 상태에서 시간이 오래 지나거나 다른 앱을 사용하면서 메모리가 부족한 경우 OS가 메모리를 확보하기 위해 백그라운드에서 실행 중이던 앱을 정리할 수 있다. 이 경우에 onDestroy()가 실행되며 메모리에서 제거될 수 있다.

4. 기기의 홈 버튼을 눌러 앱을 백그라운드로 보낸 경우

앱을 아예 껐을 때와 다르게 onDestroy()가 실행되지 않고 onPause() -> onStop() 이 실행된다.

1.onRestart() -> onStart() -> onResume() 순으로 실행된다.
2.백그라운드에 있던 앱이 포그라운드로 나오면서 화면에 보이기 직전에 onRestart() 최초 실행
3.화면에 보이는 시점에 onStart() 실행
4.앱이 포커즈를 받은 시점에 onResume() 실행

6. ✨ (공유 버튼으로) 화면의 일부만 가려진 경우

위와 같이 화면이 일부만 가려지는 경우가 있다.

onPause() 만 실행된다.

1.액티비티가 포커즈를 잃으면서 (사용자와 상호 작용 할 수 없는 상태) onPause() 실행
2.하지만 아직 화면이 완전히 가려진 것이 아니므로 onStop()은 실행되지 않음

7. 6번 이후 공유 하거나 공유 화면을 닫은 경우

onResume() 실행된다.

1.화면이 다시 포커즈를 받았으므로 onResume() 실행
2.화면이 완전히 가려 onStop() 된 것이 아니므로 onStop()의 짝인 onStart() 역시 실행되지 않음

8. ✨ 화면을 회전한 경우

onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onResume() 순으로 실행된다.

1.onPause() -> onStop() -> onDestroy()는 액티비티가 종료되는 과정과 동일한 순서이다.
2.onCreate() -> onStart() 0> onResume()은 액티비티가 새로 시작되는 과정과 동일한 순서이다.
3.위와 같이 실행되는 이유는 화면이 회전하게 되면 모든 부분을 다시 새로 그려야 하기 때문이다.
4.onDestroy() 이후 onCreate()가 다시 실행되기 때문에 가지고 있던 상태를 모두 잃게 된다.
5.이를 방지하기 위해 Manifest.xml에 설정하거나 특정 메소드를 사용할 수도 있지만 가장 좋은 방법은 뷰모델과 라이브 데이터를 사용하는 것이다.
6.뷰모델은 액티비티의 생명 주기에 영향을 받지 않기 때문에 앱이 실행되는 동안 유지되어야 하는 값과 상태 데이터를 뷰모델로 분리해서 관리할 수 있다.

6번 공유 버튼 사진 출처 : https://m.blog.naver.com/ezpbill/221217959125
상황별 라이프 사이클 참고 : https://latte-is-horse.tistory.com/274

profile
개린이

0개의 댓글