[Android] 액티비티 컴포넌트 - 액티비티 생명주기

2022. 1. 5. 14:13· Android

 

생명주기 Life Cycle

 

액티비티가 생성되어 소멸하기까지의 과정

 

 

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

 

 

 

onCreate()

 

- 전체 수명주기 동안 한번만 발생해야 하는 기본 애플리케이션 시작 로직 실행

(초기화, viewModel 연결 등)

- savedInstanceState 매개변수를 수신하는 단계

 

 

onStart()

 

- 이 시점부터 사용자가 Activity를 볼 수 있음

 

 

onResume()

 

- 앱이 사용자와 상호작용하는 단계.
어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때까지 앱이 이 상태에 머무름

- 활동이 onPause()에서 onResume() 상태로 돌아오면 시스템이 onResume() 메소드를 다시 한 번 호출

- 활동이 onResume() 상태로 전환될 때마다 필요한 다른 초기화 작업도 수행

 

 

onPause()

 

- 다른 Activity의 호출로 해당 액티비티가 백그라운드로 진입할 때 호출

 

 

onStop()

 

- Activity가 완전히 보이지 않음. but, 다시 보이면 복원가능

- CPU를 비교적 많이 소모하는 종료 작업을 실행해야 함

 

 

onDestory()

 

- 시스템은 다음 중 하나에 해당할 때 이 콜백을 호출

1) (사용자가 활동을 완전히 닫거나 활동에서 finish()가 호출되어) 활동이 종료되는 경우

2) 구성 변경(ex: 기기 회전, 멀티 윈도우 모드)으로 인해 시스템이 일시적으로 활동을 소멸시키는 경우

 

 

 

액티비티의 상태

 

- 활성 : 액티비티 화면이 출력되고 있고 사용자가 이벤트를 발생시킬 수 있는 상태

- 일시 정지 : 액티비티의 화면이 출력되고 있지만 사용자가 이벤트를 발생시킬 수 없는 상태

- 비활성 : 액티비티의 화면이 출력되고 있지 않는 상태

 

 

활성 상태

 

액티비티가 실행되어 화면에 나오고 사용자 이벤트를 처리할 수 있는 상태

액티비티가 포커스를 가지는 상태. 버튼을 클릭하거나 edit text에 글을 입력할 수 있는 상태

 

처음 실행된 액티비티는 onCreate() -> onStart() -> onResume() 함수까지 호출된다.

그리고, setContentView() 함수로 출력한 내용이 액티비티 화면에 나온다.

setContentView() 함수를 onStart()나 onResume() 함수에서 호출해도 화면이 출력되지만,

최초에 한 번만 호출되는 onCreate() 함수에서 많이 호출한다.

 

 

일시 정지 상태

 

onPause() 함수까지 호출된 상태

일반적으로 액티비티가 화면에 보이지만 포커스를 잃어 사용자 이벤트를 처리할 수 없는 상태

(ex : 화면 분할 모드)

 

 

비활성 상태

 

액티비티가 종료되지 않고 화면에만 보이지 않는 상태

인텐트로 다른 액티비티를 실행했거나 홈 버튼을 눌러 런처 화면으로 이동해 액티비티가 보이지 않는 상황

활성 상태 -> 비활성 상태 => onPause() ->onStop()

비활성 상태 -> 활성 상태 => onRestart() -> onStart() -> onResume()

 

 

더보기

onCreate() 함수만 이용해서 액티비티를 작성해도 별 문제가 생기지 않는데

나머지 생명주기 함수를 굳이 이용할 이유가 있나?

 

만약, 생명주기 함수를 이용해 적절하게 제어하지 않는다면 화면에 안 보이는데도

작업이 계속 진행되어 네트워크 트래픽이 과도하게 발생하거나 배터리가 소모될 것이다.

그러면, 사용자는 악성 앱으로 생각할 수도 있다.

 

 

액티비티 상태 저장

 

만약 액티비티를 종료할 때 저장했다가 복원해야 할 데이터가 있다면 Bundle이라는 객체에 담아 주면 됩니다.

다른 생명주기 함수는 매개변수를 가지지 않지만 onCreate(), onRestoreInstanceState(), onSaveInstanceState() 함수는

매개변수를 가지며 모두 Bundle 객체이다.

이 번들 객체를 이용해 데이터를 저장하고 복원할 수 있다.

 

onSaveInstanceState()는 onStop() 함수 다음에 호출되므로 이 함수가 호출된다는 것은

액티비티가 종료된다는 의미이다.

그러므로 개발자가 onSaveInstanceState() 함수의 매개변수로 전달되는 Bundle에

데이터를 담아 주면 자동으로 데이터를 파일로 저장해 준다.

 

 

override fun onSaveInstanceState(outState: Bundle) {
	super.onSaveInstanceState(outState)
    outState.putString("data1", "hello")
    outState.putInt("data2", 10)
}

(번들에 데이터 저장)

 

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
	super.onRestoreInstanceState(savedInstanceState)
    val data1 = savedInstanceState.getString("data1")
    val data2 = savedInstanceState.getInt("data2")
}

(번들에 저장된 데이터 가져오기)

 

 

Launch Mode (4가지)

1. standard(default)

- 인텐트할 때마다 Activity를 새로 생성

2. singleTop

- 인텐트할때마다 새로 생성하나, 동일한 Activity가 해당 task의 top에 있을 경우

새로 생성하지 않고 기존에 있던 Activity 호출

- 생명주기는 onPause() -> onNewIntent() -> onResume

3. singleTask

- 하나의 Activity만 생성되나, 다른 Activity가 해당 태스트의 일부가 되는 것을 허용

4. singleInstance

- singleTask와 비슷하나 그 어떤 Activity와도 섞이지 않고 유일한 Activity로 동작

- task 안에 activity가 하나만 존재

 

 

 

onSaveInstanceState

- 시스템이 이전 상태를 복원하기 위해 사용하는 저장된 데이터를 InstanceState라고 하며,

이는 Bundle 객체에 저장된 키-값 쌍의 컬렉션

- onSaveInstanceState()를 사용하여 간단하고 가벼운 UI 상태를 저장할 수 있음

- 저장된 인스턴스 상태를 사용하여 UI 상태 복원

 

 

 

 

+)

 

 

Q) 액티비티에서 뒤로가기 버튼을 누르면?

A)

- Activity::onBackPressed() 콜백 함수가 호출

Androidx에서는 androidx.activity.OnBackPressedCallback 추상 클래스 제공

- OnBackPressedCallback::handleOnBackPressed() 메소드를 제공하고 있어서,

액티비티와의 의존성을 줄이고 Fragment에서 '뒤로 가기 버튼 로직'을 추가할 수 있음

- onBackPressedDispatcher.addCallback(LifecycleOwner, OnBackPressedCallback)을 사용해서

Fragment를 등록할 수 있음

 

 

Q) 액티비티에서 홈 버튼을 누르면?

A)

- 홈 버튼은 앱에서 특별히 제어할 수 없음

- 사용자가 홈 키를 눌러 사용중인 앱이 Background로 넘어가는 경우

Activity::onUserLeaveHint() 함수가 호출

- 앱을 사용중에 전화가 걸려올 때/타이머 등에 의한 호출 X

- 사용자가 선택적으로 액티비티가 백그라운드로 이동하는 경우에만 호출

 

 

Q) 현재 A 액티비티가 포그라운드 상태일 때

B 액티비티로 전환되면 발생하는 lifecycle callback 함수는?

A)

A : onPause()

B : onCreate()

B : onStart()

B: onResume()

A : onStop()

 

 

Q) 위 상황에서 B 액티비티에서 finish() 함수를 호출하게 되면

발생하는 Lifecycle 순서는?

A)

B : onPause()

A : onRestart()

A: onStart()

A: onResume()

B : onStop()

B : onDestroy()

 

 

 

 

저작자표시 비영리 변경금지 (새창열림)

'Android' 카테고리의 다른 글

[Android] 코루틴 Coroutine  (0) 2022.04.01
[Android] 액티비티 컴포넌트 - 액티비티 ANR 문제와 코루틴  (0) 2022.01.05
[Android] 액티비티 컴포넌트 - 인텐트  (0) 2022.01.05
[Android] 안드로이드 앱의 기본 구조  (0) 2022.01.04
[AndroidStudio] Android Studio 업데이트 오류 해결 (missing essential plugin org.jetbrains.android please reinstall android studio from scratch)  (0) 2021.08.01
'Android' 카테고리의 다른 글
  • [Android] 코루틴 Coroutine
  • [Android] 액티비티 컴포넌트 - 액티비티 ANR 문제와 코루틴
  • [Android] 액티비티 컴포넌트 - 인텐트
  • [Android] 안드로이드 앱의 기본 구조
YOONJELLY
YOONJELLY
YOONJELLY
JELLYJELLY
YOONJELLY
전체
오늘
어제
  • 분류 전체보기 (153)
    • Springboot (2)
    • Android (15)
    • Algorithm (126)
      • 개념 (8)
      • BOJ (91)
      • Programmers (15)
      • SWEA (4)
    • 경험_기록 (1)
    • RIM_TIP (4)
    • Github (2)
    • CS (1)
      • 운영체제 (1)
      • 컴퓨터네트워크 (0)
      • 정보처리기사 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 완전탐색
  • 소프티어
  • BOJ
  • Android
  • DP
  • 안드로이드
  • 큐
  • softeer
  • 그리디
  • programmers
  • 자료구조
  • 정렬
  • 코딩테스트
  • DFS
  • BFS
  • kotlin
  • 이진탐색
  • 문자열
  • 프로그래머스
  • 백준
  • 딕셔너리
  • 알고리즘
  • 액티비티컴포넌트
  • SWEA
  • 코틀린
  • Python
  • 파이썬
  • 이것이코딩테스트다
  • 다이나믹프로그래밍
  • 스택

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
YOONJELLY
[Android] 액티비티 컴포넌트 - 액티비티 생명주기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.