Today.dev

액티비티 생명 주기 본문

안드로이드/개발

액티비티 생명 주기

otu165 2021. 6. 17. 17:07

콜백은 상태 변화에 적합한 특정 작업을 실행할 수 있도록 한다. 적시에 알맞은 작업을 하고 적절하게 전환을 처리하면 앱이 더욱 안정적으로 기능할 수 있다.

  1. onCreate()
    • 시스템이 활동을 생성할 때 실행되는 것으로 필수적으로 구현해야 한다.
    • savedInstanceState : 활동의 이전 상태가 저장된 Bundle 객체 (처음 생성된 활동의 경우 Bundle == null)
    • lateinit var textView: TextView
      
      // some transient state for the activity instance
      var gameState: String? = null
      
      override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
              setContentView(R.layout.main_activity)
      
          // recovering the instance state
          gameState = savedInstanceState?.getString(GAME_STATE_KEY)
      
          textView = findViewById(R.id.text_view)
      }
      
      // 해당 메서드는 onSaveInstanceState 에 의해 저장된 데이터가 있는 경우에만 호출된다. 
      override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
          textView.text = savedInstanceState?.getString(TEXT_VIEW_KEY)
      }
      
      // 액티비티가 destroy 되는 등의 이유로 데이터를 저장(백업)할 때 호출된다.
      override fun onSaveInstanceState(outState: Bundle?) {
          outState?.run {
              putString(GAME_STATE_KEY, gameState)
              putString(TEXT_VIEW_KEY, textView.text.toString())
          }
          // call superclass to save any view hierarchy
          super.onSaveInstanceState(outState)
      }
  2. onStart()
    • 해당 메서드가 호출되면 액티비티가 사용자에게 보여지고 앱은 액티비티를 foreground 에 보내 상호작용할 수 있도록 준비한다.
    • 앱이 UI 를 관리하는 코드를 초기화한다.
  3. onResume()
    • 해당 메서드가 호출되었을 때 어플리케이션이 사용자와 상호작용한다.
    • 어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때 까지 앱이 이상태에 머무른다.
    • ex) 전화, 다른 활동으로 이동, 기기 화면 종료
    • onResume() 을 구현하여 onPause() 중에 해제하는 구성요소를 초기화하고, 활동이 재개됨 상태로 전활될 때마다 필요한 다른 초기화 작업도 수행해야 한다.
    • class CameraComponent : LifecycleObserver {
          ...
      
          // RESUME 상태에서 카메라 초기화 작업 수행
          @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
          fun initializeCamera() {
              if (camera == null) {
                  getCamera()
              }
          }
          ...
      }
  4. onPause()
    • 사용자가 액티비티를 떠나면 가장 먼저 호출되는 메서드 (액티비티 완전 소멸단계 X)
    • 포커스가 아웃되어 onPause() 메서드가 호출되었어도 멀티윈도우 기능을 사용하고 있다면 여전히 앱이 보여질 수 있음
    • 배터리 사용량을 줄이기 위해 onPause() 메서드에서 리소스 해제를 할 수 있지만, 멀티 윈도우 기능을 지원하기 위해 onPause() 대신 onStop() 콜백에서 리소스와 작업을 완전히 중단하는 것이 좋다.
    • class CameraComponent : LifecycleObserver {
      
          ...
              // PAUSE 상태에서 리소스 해제 -> 비추천! 멀티윈도우 지원을 위해 STOP 상태에서 수행
          @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
          fun releaseCamera() {
              camera?.release()
              camera = null
          }
      
          ...
      }
    • onPause() 메서드는 아주 짧은 시간 실행되므로 사용자나 앱 데이터를 저장하거나, 네트워크 호출을 하거나, 데이터베이스 트랜잭션을 수행해선 안 된다. (완료 불가)
      • 부하가 큰 종료 작업은 onStop() 상태에서 수행해야 함
    • 액티비티는 다시 시작되거나 사용자에게 완전히 보이지 않게 될 때까지 PAUSE 상태에 있다.
  5. onStop()
    • 액티비티가 사용자에게 더 이상 표시되지 않으면 중단 상태에 들어가고, 해당 메서드가 호출된다.
    • ex) 새로 시작된 액티비티가 full-screen 일 경우
    • 필요하지 않은 리소스를 해제하거나 조정해야 한다.
    • CPU를 많이 소모하는 종료 작업을 실행해야 한다.
    • ex) 데이터베이스 트랜잭션
    • // SQLite 를 사용하는 예제 -> 비추천!
      // SQLite에 대한 추상화 레이어를 제공하는 Room 을 사용해라.
      override fun onStop() {
          super.onStop()
      		
      		// 현재 작업상태를 잃고 싶지 않으므로 노트의 초안을 저장한다.
          val values = ContentValues().apply {
              put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText())
              put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle())
          }
      
          // AsyncQueryHandler이나 동등한 환경에서 백그라운드로 업데이트 수행
          asyncQueryHandler.startUpdate(
                  token,     // int token to correlate calls
                  null,      // cookie, not used here
                  uri,       // The URI for the note to update.
                  values,    // The map of column names and new values to apply to them.
                  null,      // No SELECT criteria are used.
                  null       // No WHERE columns are used.
          )
      }
    • STOP 상태에 있으면 Activity 객체는 메모리에 저장된다.
  6. onDestroy()
    • 시스템은 다음중 하나에 해당할 때 해당 콜백을 호출한다. (isFinishing() 메서드로 구분 가능)
      1. (사용자가 액티비티를 완전히 닫거나 액티비티에서 finish() 가 호출되어 액티비티가 종료되는 경우 → 액티비티가 수신하는 마지막 수명 주기 콜백이 됨
      2. 기기 회전 또는 멀티윈도우 모드로 인해 시스템이 일시적으로 액티비티를 소멸시키는 경우 → 시스템이 즉시 새 활동 인스턴스를 생성하고 onCreate() 가 호출됨
    • ViewModel 객체를 이용하여 액티비티의 뷰 데이터를 저장해야 한다.

출처

Android developers_활동 생명 주기에 대한 이해

'안드로이드 > 개발' 카테고리의 다른 글

API KEY 관리  (0) 2021.06.23
Comments