액티비티 수명 주기 관리
onCreate()
- 액티비티를 생성할 때 시작한다.
- 시스템이 액티비티에 처음 만들어질 때 시작되는 콜백을 필수적으로 구현해야한다.
- 액티비티가 만들어지면 Created 상태로 진입한다.
- 이 메소드는 액티비티의 생애의 한번만 실행된다.
- 액티비티의 전체 수명주기 동안 한 번만 발생해야하는 기본 앱 시작 로직
- 데이터를 사용자 인터페이스(UI)의 목록 뷰에 표시하는 과정. 예를 들면 리사이클러뷰 설정
- 액티비티를 viewModel과 연결
- 일부 클래스 범위 변수를 인스턴스화 할 수도 있다.
- super.onCreate() 호출 필수
- onCreate()를 비롯한 모든 생명주기 콜백 메서드들은 메인스레드에서 실행된다.
- 사용자 인터페이스, 이벤트 처리한다.
- 메인 스레드에서 오래 걸리는 작업, 예를 들어 네트워크 요청, 대량의 데이터 처리등을 수행하면 안된다.
- ANR(애플리케이션 응답없음)을 유발한다.
- 백그라운드 스레드나 AsyncTask, Loader, Coroutines를 사용해야한다.
- saveInstanceState
- 안드로이드 액티비티 또는 프레그먼트의 상태를 저장하고 복원하는 데 사용된다.
- 상태(state)란?
- 사용자의 인터페이스(UI)의 특정 시점에서의 정보를 의미하는데
- 이는 사용자가 입력한 텍스트, 스크롤의 위치, 체크박스의 체크 여부등을 포함한다.
- 액티비티가 파괴되었을 때 saveInstanceState는 이러한 상황에서 사용자 인터페이스의 현재 상태를 저장하여 액티비티나 프래그먼트가 다시 생성될 때 이전 상태를 복원할수있게 해줌
- 사용 방법
- 상태 저장
- onSaveInstanceState(Bundle outState) 메서드를 오버라이드하여 사용한다.
- 이 메서드는 시스템이 액티비티를 파괴하기 직전에 호출된다.
- Bundle 객체에 상태정보를 저장함으로써 액티비티의 상태를 저장할 수 있다.
- 상태 복원
- onCreate()
- savedInstanceState의 번들확인
- onRestoreInstanceState()
- 메소드 오버라이드
- onCreate()가 불리고 난 후 호출됨
- 시스템에 의해서 액티비티가 죽고 다시 액티비티가 생성되면 호출되기 때문에 생명주기 메서드가 아님
- onCreate()
- 상태 저장
//상태 저장
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// 상태 저장 로직
outState.putString("myKey", "myValue");
}
// 상태복원 onCreate()
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
String myValue = savedInstanceState.getString("myKey");
// 복원 로직
}
}
//상태 복원 onRestoreInstanceState
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String myValue = savedInstanceState.getString("myKey");
// 복원 로직
}
OnStart()
- 화면이 표시되기 직전에 불린다.
- onCreate()가 종료되면 액티비티는 '시작됨'상태로 전환된다.
- 액티비티가 포그라운드로 나와서 상호작용하기 위한 최종 준비에 준하는 작업이 포함된다.
- onCreate() 이후
- background -> foreground
- 액티비티가 start 상태에 들어가면 시스템은 이 콜백을 호출합니다.
- 예를 들어 이 메서드에서 앱이 UI를 관리하는 코드를 초기화한다.
- 이 메서드는 매우 빠르게 완료되고 onResume()을 호출한다.
- 화면이 표시 되기 직전에 데이터를 고치거나 ui를 초기화할 때 사용한다.
- 액티비티의 화면이 보이기 전에 애니메이션을 시작할 때 사용한다.
- 리스너 연결할 떄 사용
- 백그라운드 작업에서 가져온 데이터를 화면에 표시할 떄 사용
onResume()
- 이 상태 (resume)에서 앱은 사용자와 상호작용할수 있습니다.
- 앱은 기기가 전화를 수신 받거나 다른 액티비티로 이동하는 등 포커스를 뺴앗는 사건이 발생하기 전까지 이 상태를 유지한다.
- 방해되는 이벤트가 발생하면 onPause() 콜백을 호출합니다.
- 액티비티가 pause -> resume 상태가 되면 시스템이 onResume()을 다시 한번 호출한다.
- 따라서 onResume()은 onPause()중에 해제하는 구성요소를 초기화하고 resume 상태로 전환될 때마다 필요한 다른 초기화 작업도 수행해야한다.
- 사용자가 앱과 상호작용하는 동안 필요한 모든 리소스를 설정하거나 새로고침하는 데 이시점을 활용할 수 있다.
- 액티비티가 일시정지되었다가 다시 시작될 때 (예: 액티비티 위에 있는 풀 스크린 대화상자가 닫히거나, 사용자가 백 버튼을 눌러 이전화면으로 돌아올 때) onResume()은 다시 호출됨
- 이는 액티비티가 포그라운드로 돌아올때 필요한 리소스를 다시 설정하거나 갱신해야할 필요가 있을 때 중요하다.
- 앱이 백그라운드에서 포그라운드로 돌아올때 onResum()에서 데이터를 새로 고침하거나 UI를 업데이트 하는 것이 일반적이다.
onPause()
- 액티비티가 포커스를 잃고 pause 상태로 전환될 때 시스템은 이 함수를 호출한다.
- 예를 들어 이 상태는 사용자가 뒤로 또는 최근 버튼을 탭할 때 발생한다.
- 액티비티가 포그라운드에 있지 않는다는 것을 나타냄(멀티 윈도우 모드에 있을 경우 여전히 표시될 수도 있음)
- 액티비티가 pause 상태일 때 계속 실행되어서는 안되지만 잠시후 다시 시작할 작업을 일시중지하거나 조정합니다.
- 예
- onResume()에서 설명한 일부 이벤트가 앱 실행을 방해한다.
- 멀티 윈도우에서 하나의 창만 포커스를 가질수 있기에 시스템이 그외의 모든 다른 앱을 일시중지 시킨다.
- 새로운 반투명 상자가 열린다(dialog). 액티비티가 부분적으로 보이지만 포커스 상태가 아닌 경우에는 onPause() 상태로 유지된다.
- 반투명 대화상자(dialog)가 새로운 액티비티로 처리되는 특별한 종류의 대화상자일 경우에 onPause() 상태가 된다. 그 외에는 onResume 상태에서 유지된다.
- 여기에서 수명주기 구성요소는 구성요소가 포그라운드에 있지 않을 때 실행할 필요가 없는 기능을 모두 정지할 수 있다. 예) 카메라 미리보기 정지
- 시스템 리소스, gps등 액티비티가 일시 중지 중이고 사용자가 필요로 하지 않을 때 배터리 수명에 영향을 미칠 수 있는 모든 리소스를 해제할 수도 있다.
- 일시중지 상태는 멀티 윈도우에서는 보이는 상태일 수 있다.
- 그러므로 UI관련 리소스와 작업을 완전히 해제하거나 조정할 때는 onStop()을 사용하는 것이 좋다.
- 이 메소드를 사용하여 데이터를 저장하거나 네트워크 호출을 하거나 데이터베이스 트랜잭션을 실행해서는 안된다.
- 이러한 작업은 매서드 실행이 끝나기 전에 완료되지 못할 수도 있다.
- 그 대신 부하가 큰 종료 작업은 onStop() 상태일때 실행해야한다.
- onPause() 메서드의 실행이 완료되더라도 액티비티가 pause 상태로 남아있을 수 있다.
- 오히려 액티비티는 다시 시작되거나 사용자에게 완전히 보이지 않게 될때 까지 이 상태에 머무른다.
- 액티비티가 다시 시작되면 시스템은 다시한번 resume() 콜백을 호출한다.
- 액티비티가 pause 상태에서 resume됨 상태로 돌아오면 시스템은 이미 메모리에 존재하는 Activity 인스턴스를 재사용한다.
- 이 과정에서 onResume() 메서드가 호출되어 액티비티가 사용자와의 상호작용을 재개할 준비가 된다.
- 이 시나리오에서는 액티비티가 이미 생성되어 메모리에 로드된 상태이기 때문에 onCreate(), onStart()등의 초기화 콜백 메서드들이 다시 호출되지 않는다.
- 액티비티가 완전히 보이지 않게 되면 시스템은 onStop()을 호출한다.
onStop()
- 액티비티가 사용자에게 더 이상 표시 되지않으면 stopped 상태에 들어가고 시스템은 onStop()콜백을 호출한다.
- 예를 들어 새로 시작된 액티비티가 화면 전체를 차지할 때
- onStop()메서드에서는 앱이 사용자에게 보이지 않는 동안 앱은 필요하지 않은 리소스를 해제하거나 조정해야한다.
- 예를 들어 앱은 애니메이션을 일시중지하거나 세밀한 위치 업데이트에서 대략적인 위치 업데이트로 전환할 수 있다.
- onStop()은 사용자에게 표시 되지 않지만 UI가 해제되는 곳이 아니다.
- onStop()을 사용하여 CPU를 비교적 많이 소모하는 종료 작업을 실행해야한다.
- 정보를 데이터 베이스에 저장할 시기로 사용가능
- 액티비티가 onStop 상태에 들어가면 Activity 객체는 메모리 안에 머무르게 된다.
- 메모리 안에 Activity 객체는 모든 상태 및 멤버 정보를 보유하고 있지만 window manager와 연결되어 있지는 않습니다.
- 액티비티가 resume 되면 다시 이 정보를 호출한다.
- 최상위 상태가 onResume 상태인 콜백 메서드 중에 생상된 구성요소는 다시 초기화할 필요가 없습니다.
- 또한 시스템은 레이아웃에 있는 각 view 객체의 현재 상태도 기록 합니다.
- 따라서 사용자가 editText 위젯에 텍스트를 입력하면 해당 내용이 저장되기 때문에 이를 저장 및 복원할 필요가 없습니다.
- 상황별 동작:
- 액티비티가 단순히 Stopped 상태에서 다시 활성화되는 경우(onStop -> onStart -> onResume):
- EditText의 내용은 메모리에 남아 있으며, 그대로 유지됩니다.
- 액티비티가 시스템에 의해 프로세스가 제거된 후 다시 생성되는 경우:
- 시스템이 Bundle에 저장된 데이터를 사용하여 EditText와 같은 View의 상태를 복원합니다.
- 이 복원은 자동으로 이루어지므로, 개발자가 따로 처리하지 않아도 됩니다.
- 액티비티가 단순히 Stopped 상태에서 다시 활성화되는 경우(onStop -> onStart -> onResume):
- 예외적인 상황
- 자동 복원이 실패하거나, 특별한 복원이 필요할 경우 onSaveInstanceState()와 onRestoreInstanceState()를 통해 수동으로 처리할 수 있습니다. 하지만 일반적인 경우에는 이런 작업이 필요 없습니다.
- 상황별 동작:
- 액티비티는 stopped 상태에서 다시 시작되어 사용자와 상호 작용하거나 실행을 종료하고 사라집니다.
- 액티비티가 다시 시작되면 시스템은 onRestart()를 호출 합니다.
- 액티비티가 종료되면 onDestroy()를 호출합니다.
onDestroy()
- 이 메소드는 액티비티가 소멸되기 전에 호출됩니다.
- 시스템은 다음 중 하나에 해당할 때 이 콜백을 호출합니다.
- (사용자가 액티비티를 완전히 닫거나 액티비티에서 finish()가 호출되어) 액티비티가 종료되는 경우
- 구성 변경(기기 회전 또는 멀티 윈도우 모드)로 인해 시스템이 일시적으로 액티비티를 소멸 시키는 경우
- 여기서 수명 주기 구성요소는 액티비티가 소멸되기 전에 필요한 것을 정리할 수 있습니다.
- 액티비티에 소멸되는 이유를 결정하는 로직을 입력하는 대신 ViewModel객체를 사용하여 액티비티의 관련 뷰 데이터를 포함해야합니다.
- 액티비티가 구성 변경으로 인해 다시 생성될 경우 ViewModel은 그대로 보존되어 다음 액티비티 인스턴스에 전달되므로 추가 작업이 필요하지 않습니다.
- 액티비티가 다시 생성되지 않을 경우 viewmodel은 onCleared() 메서드를 호출하여 액티비티가 소멸되기 전에 모든 데이터를 정리 해야합니다.
- 이와 같은 두 가지 시나리오는 isFinishing() 메서드로 구분 할 수 있습니다.
- 액티비티가 종료 되는 경우 onDestroy()는 액티비티가 수신하는 마지막 수명 주기 콜백이 됩니다.
- 구성 변경으로 인해 onDestroy()가 호출되는 경우 시스템이 즉시 새 액티비티 인스턴스를 생성한 다음 새로운 구성에서 새로운 인스턴스에 관해 onCreate()를 호출합니다.
- onDestroy() 콜백은 이전의 콜백에서 아직 해제되지 않은 모든 리소스(onStop())을 해제해야합니다.
'android' 카테고리의 다른 글
8. Android WebView 공식문서 공부 (0) | 2023.11.04 |
---|---|
6. WebSettings 안드로이드 공식문서 공부 (0) | 2023.09.23 |
5. 안드로이드 Application 공식문서 공부 (0) | 2023.09.19 |
4. (android) WebViewClient 공식문서 공부 (0) | 2023.09.17 |
3. (android) WebView, WebChromeClient 공식문서 공부 (0) | 2023.09.16 |