본문 바로가기

android

Activity 공식 문서 공부

액티비티 수명 주기 관리

onCreate()

  1. 액티비티를 생성할 때 시작한다.
  2. 시스템이 액티비티에 처음 만들어질 때 시작되는 콜백을 필수적으로 구현해야한다.
  3. 액티비티가 만들어지면 Created 상태로 진입한다.
  4. 이 메소드는 액티비티의 생애의 한번만 실행된다.
  5. 액티비티의 전체 수명주기 동안 한 번만 발생해야하는 기본 앱 시작 로직
    1. 데이터를 사용자 인터페이스(UI)의 목록 뷰에 표시하는 과정. 예를 들면 리사이클러뷰 설정
    2. 액티비티를 viewModel과 연결 
    3. 일부 클래스 범위 변수를 인스턴스화 할 수도 있다.
  6. super.onCreate() 호출 필수
  7. onCreate()를 비롯한 모든 생명주기 콜백 메서드들은 메인스레드에서 실행된다.
    1. 사용자 인터페이스, 이벤트 처리한다.
    2. 메인 스레드에서 오래 걸리는 작업, 예를 들어 네트워크 요청, 대량의 데이터 처리등을 수행하면 안된다.
    3. ANR(애플리케이션 응답없음)을 유발한다.
    4. 백그라운드 스레드나 AsyncTask, Loader, Coroutines를 사용해야한다.
  8. saveInstanceState 
    1. 안드로이드 액티비티 또는 프레그먼트의 상태를 저장하고 복원하는 데 사용된다.
    2. 상태(state)란? 
      1. 사용자의 인터페이스(UI)의 특정 시점에서의 정보를 의미하는데
      2. 이는 사용자가 입력한 텍스트, 스크롤의 위치, 체크박스의 체크 여부등을 포함한다.
      3. 액티비티가 파괴되었을 때 saveInstanceState는 이러한 상황에서 사용자 인터페이스의 현재 상태를 저장하여 액티비티나 프래그먼트가 다시 생성될 때 이전 상태를 복원할수있게 해줌
    3. 사용 방법
      1. 상태 저장
        1. onSaveInstanceState(Bundle outState) 메서드를 오버라이드하여 사용한다.
        2. 이 메서드는 시스템이 액티비티를 파괴하기 직전에 호출된다.
        3. Bundle 객체에 상태정보를 저장함으로써 액티비티의 상태를 저장할 수 있다.
      2. 상태 복원
        1. onCreate()
          1. savedInstanceState의 번들확인
        2. onRestoreInstanceState()
          1. 메소드 오버라이드
          2. onCreate()가 불리고 난 후 호출됨
          3. 시스템에 의해서 액티비티가 죽고 다시 액티비티가 생성되면 호출되기 때문에 생명주기 메서드가 아님

 

//상태 저장
@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()

  1. 화면이 표시되기 직전에 불린다.
  2. onCreate()가 종료되면 액티비티는 '시작됨'상태로 전환된다.
  3. 액티비티가 포그라운드로 나와서 상호작용하기 위한 최종 준비에 준하는 작업이 포함된다.
    1. onCreate() 이후
    2. background -> foreground
  4. 액티비티가 start 상태에 들어가면 시스템은 이 콜백을 호출합니다.
  5. 예를 들어 이 메서드에서 앱이 UI를 관리하는 코드를 초기화한다.
  6. 이 메서드는 매우 빠르게 완료되고 onResume()을 호출한다.
  7. 화면이 표시 되기 직전에 데이터를 고치거나 ui를 초기화할 때 사용한다.
  8. 액티비티의 화면이 보이기 전에 애니메이션을 시작할 때 사용한다.
  9. 리스너 연결할 떄 사용
  10. 백그라운드 작업에서 가져온 데이터를 화면에 표시할 떄 사용

onResume()

  1. 이 상태 (resume)에서 앱은 사용자와 상호작용할수 있습니다.
  2. 앱은 기기가 전화를 수신 받거나 다른 액티비티로 이동하는 등 포커스를 뺴앗는 사건이 발생하기 전까지 이 상태를 유지한다.
  3. 방해되는 이벤트가 발생하면 onPause() 콜백을 호출합니다.
  4. 액티비티가 pause -> resume 상태가 되면 시스템이 onResume()을 다시 한번 호출한다.
  5. 따라서 onResume()은 onPause()중에 해제하는 구성요소를 초기화하고 resume 상태로 전환될 때마다 필요한 다른 초기화 작업도 수행해야한다.
  6. 사용자가 앱과 상호작용하는 동안 필요한 모든 리소스를 설정하거나 새로고침하는 데 이시점을 활용할 수 있다.
  7. 액티비티가 일시정지되었다가 다시 시작될 때 (예: 액티비티 위에 있는 풀 스크린 대화상자가 닫히거나, 사용자가 백 버튼을 눌러 이전화면으로 돌아올 때) onResume()은 다시 호출됨 
  8. 이는 액티비티가 포그라운드로 돌아올때 필요한 리소스를 다시 설정하거나 갱신해야할 필요가 있을 때 중요하다.
  9. 앱이 백그라운드에서 포그라운드로 돌아올때 onResum()에서 데이터를 새로 고침하거나 UI를 업데이트 하는 것이 일반적이다.

onPause()

  1. 액티비티가 포커스를 잃고 pause 상태로 전환될 때 시스템은 이 함수를 호출한다.
  2. 예를 들어 이 상태는 사용자가 뒤로 또는 최근 버튼을 탭할 때 발생한다.
  3. 액티비티가 포그라운드에 있지 않는다는 것을 나타냄(멀티 윈도우 모드에 있을 경우 여전히 표시될 수도 있음)
  4. 액티비티가 pause 상태일 때 계속 실행되어서는 안되지만 잠시후 다시 시작할 작업을 일시중지하거나 조정합니다.
    1. onResume()에서 설명한 일부 이벤트가 앱 실행을 방해한다.
    2. 멀티 윈도우에서 하나의 창만 포커스를 가질수 있기에 시스템이 그외의 모든 다른 앱을 일시중지 시킨다.
    3. 새로운 반투명 상자가 열린다(dialog). 액티비티가 부분적으로 보이지만 포커스 상태가 아닌 경우에는 onPause() 상태로 유지된다.
      1. 반투명 대화상자(dialog)가 새로운 액티비티로 처리되는 특별한 종류의 대화상자일 경우에 onPause() 상태가 된다. 그 외에는 onResume 상태에서 유지된다.
  5. 여기에서 수명주기 구성요소는 구성요소가 포그라운드에 있지 않을 때 실행할 필요가 없는 기능을 모두 정지할 수 있다. 예) 카메라 미리보기 정지
  6. 시스템 리소스, gps등 액티비티가 일시 중지 중이고 사용자가 필요로 하지 않을 때 배터리 수명에 영향을 미칠 수 있는 모든 리소스를 해제할 수도 있다.
  7. 일시중지 상태는 멀티 윈도우에서는 보이는 상태일 수 있다.
  8. 그러므로 UI관련 리소스와 작업을 완전히 해제하거나 조정할 때는 onStop()을 사용하는 것이 좋다.
  9. 이 메소드를 사용하여 데이터를 저장하거나 네트워크 호출을 하거나 데이터베이스 트랜잭션을 실행해서는 안된다.
  10. 이러한 작업은 매서드 실행이 끝나기 전에 완료되지 못할 수도 있다.
  11. 그 대신 부하가 큰 종료 작업은 onStop() 상태일때 실행해야한다.
  12. onPause() 메서드의 실행이 완료되더라도 액티비티가 pause 상태로 남아있을 수 있다. 
  13. 오히려 액티비티는 다시 시작되거나 사용자에게 완전히 보이지 않게 될때 까지 이 상태에 머무른다. 
  14. 액티비티가 다시 시작되면 시스템은 다시한번 resume() 콜백을 호출한다.
  15. 액티비티가 pause 상태에서 resume됨 상태로 돌아오면 시스템은 이미 메모리에 존재하는 Activity 인스턴스를 재사용한다.
  16. 이 과정에서 onResume() 메서드가 호출되어 액티비티가 사용자와의 상호작용을 재개할 준비가 된다.
  17. 이 시나리오에서는 액티비티가 이미 생성되어 메모리에 로드된 상태이기 때문에 onCreate(), onStart()등의 초기화 콜백 메서드들이 다시 호출되지 않는다.
  18. 액티비티가 완전히 보이지 않게 되면 시스템은 onStop()을 호출한다.

onStop()

  1. 액티비티가 사용자에게 더 이상 표시 되지않으면 stopped 상태에 들어가고 시스템은 onStop()콜백을 호출한다.
  2. 예를 들어 새로 시작된 액티비티가 화면 전체를 차지할 때
  3. onStop()메서드에서는 앱이 사용자에게 보이지 않는 동안 앱은 필요하지 않은 리소스를 해제하거나 조정해야한다.
  4. 예를 들어 앱은 애니메이션을 일시중지하거나 세밀한 위치 업데이트에서 대략적인 위치 업데이트로 전환할 수 있다.
  5. onStop()은 사용자에게 표시 되지 않지만 UI가 해제되는 곳이 아니다.
  6. onStop()을 사용하여 CPU를 비교적 많이 소모하는 종료 작업을 실행해야한다.
  7. 정보를 데이터 베이스에 저장할 시기로 사용가능
  8. 액티비티가 onStop 상태에 들어가면 Activity 객체는 메모리 안에 머무르게 된다. 
  9. 메모리 안에  Activity 객체는 모든 상태 및 멤버 정보를 보유하고 있지만 window manager와 연결되어 있지는 않습니다.
  10. 액티비티가 resume 되면 다시 이 정보를 호출한다.
  11. 최상위 상태가 onResume 상태인 콜백 메서드 중에 생상된 구성요소는 다시 초기화할 필요가 없습니다.
  12. 또한 시스템은 레이아웃에 있는 각 view 객체의 현재 상태도 기록 합니다.
  13. 따라서 사용자가 editText 위젯에 텍스트를 입력하면 해당 내용이 저장되기 때문에 이를 저장 및 복원할 필요가 없습니다.
    1. 상황별 동작:
      • 액티비티가 단순히 Stopped 상태에서 다시 활성화되는 경우(onStop -> onStart -> onResume):
        • EditText의 내용은 메모리에 남아 있으며, 그대로 유지됩니다.
      • 액티비티가 시스템에 의해 프로세스가 제거된 후 다시 생성되는 경우:
        • 시스템이 Bundle에 저장된 데이터를 사용하여 EditText와 같은 View의 상태를 복원합니다.
        • 이 복원은 자동으로 이루어지므로, 개발자가 따로 처리하지 않아도 됩니다.
    2. 예외적인 상황
      1. 자동 복원이 실패하거나, 특별한 복원이 필요할 경우 onSaveInstanceState()와 onRestoreInstanceState()를 통해 수동으로 처리할 수 있습니다. 하지만 일반적인 경우에는 이런 작업이 필요 없습니다.
  14. 액티비티는 stopped 상태에서 다시 시작되어 사용자와 상호 작용하거나 실행을 종료하고 사라집니다. 
  15. 액티비티가 다시 시작되면 시스템은 onRestart()를 호출 합니다. 
  16. 액티비티가 종료되면 onDestroy()를 호출합니다.

onDestroy()

  1. 이 메소드는 액티비티가 소멸되기 전에 호출됩니다.
  2. 시스템은 다음 중 하나에 해당할 때 이 콜백을 호출합니다.
    1. (사용자가 액티비티를 완전히 닫거나 액티비티에서 finish()가 호출되어) 액티비티가 종료되는 경우
    2. 구성 변경(기기 회전 또는 멀티 윈도우 모드)로 인해 시스템이 일시적으로 액티비티를 소멸 시키는 경우
  3. 여기서 수명 주기 구성요소는 액티비티가 소멸되기 전에 필요한 것을 정리할 수 있습니다.
  4. 액티비티에 소멸되는 이유를 결정하는 로직을 입력하는 대신 ViewModel객체를 사용하여 액티비티의 관련 뷰 데이터를 포함해야합니다.
  5. 액티비티가 구성 변경으로 인해 다시 생성될 경우 ViewModel은 그대로 보존되어 다음 액티비티 인스턴스에 전달되므로 추가 작업이 필요하지 않습니다.
  6. 액티비티가 다시 생성되지 않을 경우 viewmodel은 onCleared() 메서드를 호출하여 액티비티가 소멸되기 전에 모든 데이터를 정리 해야합니다.
  7. 이와 같은 두 가지 시나리오는 isFinishing() 메서드로 구분 할 수 있습니다.
  8. 액티비티가 종료 되는 경우 onDestroy()는 액티비티가 수신하는 마지막 수명 주기 콜백이 됩니다.
  9. 구성 변경으로 인해 onDestroy()가 호출되는 경우 시스템이 즉시 새 액티비티 인스턴스를 생성한 다음 새로운 구성에서 새로운 인스턴스에 관해 onCreate()를 호출합니다.
  10. onDestroy() 콜백은 이전의 콜백에서 아직 해제되지 않은 모든 리소스(onStop())을 해제해야합니다.