밑빠진 지식에 블로그 쓰기

LifeCycle 본문

카테고리 없음

LifeCycle

쓰는녀석 2023. 3. 16. 22:24

모든 액티비티는 생명주기를 가지고 있다.  탄생 부터 죽음 까지

 

처음 생성되어 초기화 될때부터 파괴되고 시스템에서 메모리를 회수할 떄까지

다양한 상태로 구성된다.

 

 

 

유저가 앱을 시작할때,

액티비티 사이를 이동할때

앱에서 나가고 들어올때,

 

액티비티의 상태가 변경됩니다.

 

 

우리는 이렇게 상태가 변경될때 어떤 동작을 하고 싶습니다. 즉 코드를 실행 시키고 싶다.

 

그러기 위해서는 생명주기 콜백 함수를 구현 해야한다. 

 

액티비티 상태가 변경 될때 안드로이드 시스템(운영체제)가 콜백함수를 호출한다.

 

콜백 함수와 생명주기 상태

 

onCreate() : 액티비티에 대한 초기화를 해야하는 곳

레이아웃을 inflate합니다. => 인플레이트 문서 만들기( 인플레이트란 무엇인가)

클릭리스너를 정의합니다.

뷰바인딩을 설정합니다.

 

onCreate() 실행된 후에 액티비티는 Created 상태로 간주된다.

반드시 슈퍼 클래스 구현을 호출하여 activity 생성을 해야하므로 super.onCreate()를 호출해야합니다.

다른 생명주기 콜백 메서드도 마찬가지 입니다. 

 

액티비티 생성시 단 한번 실행됩니다.

 

 

 

onStart() : onCreate() 호출 직후 호출 된다.

onStart() 실행 후에 액티비티가 화면에 보인다. ( 포커스 상태는 아니라 사용자와 상호작용은 안됩니다.)

onCreate()와 달리 여러번 실행 된다.

onStop()과 한쌍이다.

 

유저가 디바이서의 홈화면으로 넘어가면

액티비티는 스탑되고 더이상 화면에 보이지 않는다.

 

 

 

 

 

생명주기 사용 사례(Use Cases)

1. 액티비티 opening and closing : 앱을 처음 시작할때, 앱을 완전히 종료 할때

 

 - 처음 시작 할때

 

- 뒤로가기 버튼을 눌렀을 때

 

onDestory()의 실행은 그 엑티비티가 완전히 종료 되었고, garbage-collected의 후보가 된다.

Garbage collection(가비시 컬랙션) : 더이상 사용하지 않는 객체를 메모리에서 자동으로 정리 하는것

 

onDestroy()후에 시스템(안드로이드 운영체제)는 해당 리소스(메모리에 있는 엑티비티 객체)가 삭제 가능하다는 것을 알고

해당 메모리를 정리 시작합니다.

 

어떻게 메모리를 정리하지? => 가비티 컬랙터의 원리 ( 마크엔 swap) 정리

 

뒤로 가기 버튼이아닌 코드로도 엑티비티를 완전히 종료 시킬수 있다.  => finish()함수 사용

사용자가 앱을 강제 종료해도 엑티비티는 완전히 종료 된다.

 

앱이 오랫동안 화면에 표시 되지 않는 경우 안드로이드 시스템(안드로이드 운영체제)에서 자체적으로 엑티비티를 종료 할수도 있습니다. 안드뢰드 시스템(안드로이드 운영체제)는 배터리를 보존하고 앱의 리소스(메모리,cpu)를 다른 앱에서 사용할수 있도록 하기 위해서 이렇게 합니다.

 

액티비티가 종료되는 조건

1. 뒤로가기 버튼

2. 사용자의 앱 강제 종료

3. 코드로  finish() 호출

4. 안드로이드 운영체제의 판단

 

onCreate() 와 onDestory()는 엑티비티 객체의 생존 동안 한번만 호출된다.

 

onCreate()는 중요하다.

모든 초기화(레이아웃 inflate, 변수 초기화)가 진행 된다.

 

 

2. Navigation away from and back to the activity 엑티비티를 벗어나고 돌아오기

사용자는 기기를 사용하면서 앱 사이를 이동하고, 홈화면에 돌아가고, 새로운 앱을 실행하고

전화 통화와 같은 다른 액티비티의 방해를 처리합니다.

 

사용자가 activity를 벗어날때마다 activity가 완전히 종료 되지 않는다. 
- acitivy가 더이상 화면에 보이지 않을때, background에 놓인다. 화면에 보이는 상태는 foreground이다

- 앱으로 다시 돌아오면 동일한 activity가 다시 시작(생성x)되고 다시 화면에 보입니다. 이 부분을 앱의 visible lifecycle이라고 한다.

 

 

foreground에 있는 앱이 원할하게 돌아가고 , 좋은 사용자 반응과 경험을 위해 , 

리소스(메모리, cpu)를 보존하고 배터리 시간을 늘리기 위해 앱이 background에 있을때 활발히 실행되면 안된다.

 

생명주기와 관련 콜백을 이용하면 앱이 백그라운드에 있을때 진행중인 동작을 멈출수 있다.

알맞게 멈춰야 한다.

 

그리고 포그라운드(화면에 보일떄)일때 다시  멈춘 부분부터 실행 해야한다.

 

Home버튼을 누르는 건 앱을 종료 하는게 아니라 백그라운드(화면이 보이지 않은 상태)로 놓는다

 

onPause()가 실행되면 더이상 앱이 포커스( 상호작용(터치)) 되지 않습니다

onStop()이 호출되면 더이상 화면에 보지 않습니다.

 

엑티비티가 멈추지만 백그라운드에서 여전히 메모리에 객체 상태로 존재 합니다.

엑티비티는 파괴 되지 않습니다.

 

그래서 앱으로 다시돌아올수 있고 엑티비티의 리소스를 게속 유지 할수 있습니다.

 

앱이 foreground에 올때, onCreate()는 다시 호출되지 않습니다. 왜냐하면 액티비티 객체가 파괴 되지 않아서, 메모리에 있으므로 다시 생성될 필요가 없기 떄문입니다.

 

onStart() 및 onStop()은 사용자가 엑티비티를 탐색(이동) 할때 마다 여러본 호출 됩니다.

앱이 중지되어 백그라운드로 이동하거나 

앱이 다시 시작되어 포그라운도 돌아올때 수행하고 싶은 작업을 onStart()와 onStop()에서 수행하세요

 

onCreate()와 onRestart()는 화면이 표시되기전에 호출됩니다.

onCreate() 메서드는 처음에만 호출되고 onRestart()는 그 이후에 호출됩니다.

onRestart() 메서드는 액티비티가 처음으로 시작되지 않는 경우에만 호출하려는 코드를 넣는 곳입니다.

 

3. Partially hide the activity : 엑티비티를 부분적으로 가리는 경우

onStart()가 호출되고 나면 엑티비티가 화면에 표시된다.

onResume()호출되면 앱이 사용자 포커스를 얻습니다. => 사용자가 앱과 상호 작용 할 수 있습니다.

앱이 완전히 화면에 표시되고 사용자 포커스가 있는 수명 주기 부분을 대화형 수명 주기라고 합니다.

 

앱이 백그라운드로 전환되면 

onPasue() 이후 포커스가 사라지고

onStop()이후 앱이 더이상 표시 되지 않습니다.

 

엑티비티가 부분적으로 가려지면서 표시 될수 있으므로

focuse(포커스)와 visibility(가시성)의 차이는 중요합니다.

 

화면에 보이지만 포커스는 없을수 있습니다.

화면에 보이지만                                  포커스는 없는 엑티비티

 

이런 경우에 onStop()는 호출되지 않는다. 왜냐하면 엑티비티가 여전히 부분적으로 "보이기" 때문이다.

하지만 사용자 포커스는 없기 때문에 사용자와 상호작용 할수 없습니다. 앞에 있는 Share with 액티비티에 사용자 포커스가 있으므로 Share with 액티비티가 상호작용할 수 있다.

 

onPause()만 있는 중단은 일반적으로 activity으로 돌아가거나 다른 activity이나 앱으로 이동하기 전에 잠시 동안 지속됩니다. 일반적으로 앱의 나머지 부분이 정지된 것처럼 보이지 않도록 UI를 계속 업데이트하려고 합니다.

 

onPause()에서 실행되는 코드는 다른 항목이 표시되는 것을 차단하므로 onPause()의 코드를 가볍게 유지하십시오. 예를 들어 전화가 오면 onPause()의 코드가 수신 전화 알림을 지연시킬 수 있습니다.

 

onPause() 코드는 가볍게 유지 해야한다.

 

onResume()과 onPause() 모두 포커스와 관련이 있습니다.

액티비티에 포커스가 있을 때 onResume() 메서드가 호출되고 액티비티가 포커스를 잃을 때 onPause() 메서드가 호출됩니다.

 

 

4. 구성 변경(configuration changes) 살펴 보기

구성 변경은 장치의 상태가 급격하게 변경되어 시스템이 변경 사항을 해결하는 가장 쉬운 방법은 활동을 완전히 종료하고 다시 빌드하는 것일 때 발생합니다.

 

configuration changes 상황

1. 유저가 디바이스의 언더를 바꾸는 경우 -> 텍스트 방향과 문자열 길이를 수용하기 위해 전체 레이아웃 변경 가능성 존재

2. 유저가 dock이나 물리적인 키보드를 추가하는 경우

3. 기기의 방향이 바뀌는 경우 -> 새로운 방향에 맞게 레이아웃을 변경 해야한다.

 

구성 변경 발생시시스템(안드로이드 운영체제는) 액티비티를 종료하는 콜백을 호출하고, 구성 변경에 맞게 다시 새로운 액티비티를 시작하는 콜백을 호출 합니다. 새로운 액티비티를 호출 하므로 이전 액티비티의 데이터는 손실됩니다.

 

가령, 화면 변경시 데이터가 손실되어 나타나면 사용자에 좋지 않은 경험을 겪게 할 수 있으므로이는 개선해야한다.

 

개선방법은 이전 액티비티의 상태를 유지하는 것입니다. 이를 위해 안드로이드 프레임 워크는 onSaveInstanceState() 함수를 제공 하고 있습니다.

 

그림을 보면 onSaveInstanceState()함수는 onStop() 이후에 호출된다.

이것은 앱이 백그라운드로 들어갈떄 마다 호출된다.

 

액티비티가 포그라운드에서 백그라운드로 변할때 소량의 정보를 번들에 저장할 수 있는 기회를 제공합니다.

앱이 종료될 때까지 기다리면 시스템이 리소스 압력을 받고 있을 수 있으므로 시스템은 지금 이 데이터를 저장합니다.

 

사용자가 데이터 손실을 경험하지 않도록 해야 합니다.

 

 

onCreate()에서 번들 데이터를 복원 할수 있다.

프로세스 종료 때문에 액티비티가 재시작 되는 경우 onCreate()에 번들이 전달 된다

 

액티비티가 완전 처음 생성 되는 경우 Bundle값은 null이다Bundle값이 null이 아닌 경우 이 액티비티는 어떤 이유 때문에 재생성 된것이다.

 

액티비티가 처음 생성이 아닌 재생성일 경우 onRestorInstanceState()함수가  onStart() 호출이후에 호출 된다.

 

 

<요약>액티비티 lifecycle는 액티비티 상태의 집합이다.액티비티가 처음 생성될때 시작되고 액티비티가 파괴 될때 끝납니다.유저가 액티비티 사이를 이동하거나 앱 안밖으로 이동할때 액티비티 라이프 사이클 안에 있는 상태로 이동합니다.각 상태는 콜백 함수에 대응 됩니다.

 

https://developer.android.com/codelabs/basic-android-kotlin-training-activity-lifecycle?continue=https%3A%2F%2Fdeveloper.android.com%2Fcourses%2Fpathways%2Fandroid-basics-kotlin-unit-3-pathway-1%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fbasic-android-kotlin-training-activity-lifecycle#5 

 

활동 수명 주기 단계  |  Android 개발자  |  Android Developers

이 Codelab에서는 활동 수명 주기와 로깅을 알아봅니다.

developer.android.com

 

 

 

https://developer.android.com/codelabs/basic-android-kotlin-training-activity-lifecycle?continue=https%3A%2F%2Fdeveloper.android.com%2Fcourses%2Fpathways%2Fandroid-basics-kotlin-unit-3-pathway-1%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fbasic-android-kotlin-training-activity-lifecycle#2 

 

활동 수명 주기 단계  |  Android 개발자  |  Android Developers

이 Codelab에서는 활동 수명 주기와 로깅을 알아봅니다.

developer.android.com