생명주기 Life Cycle
액티비티가 생성되어 소멸하기까지의 과정
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 |