본문 바로가기

Android

[Android] Activity 생명주기와 상태

1. 액티비티 생명주기 (Lifecycle)

 

액티비티가 있을 수 있는 모든 상태와 각 상태에서 다음 상태로 전환하는 것과 관련된 콜백의 방향이 있는 그래프

( 액티비티가 생성될 때부터 종료될 때까지의 일련의 상태 )

 

 

 

 

액티비티 상태 및 앱 공개 설정

 

상태 변경은 사용자 동작, 장치 회전과 같은 구성 변경 또는 시스템 동작에 의해 시작됨

 

- Created (아직 보이지 않음) : 생성

- Started (보임) : Activity가 시작은 되었으나 터치는 먹히지 않음

- Resume (보임) : User Interface를 받게 됨 (입력을 받게 됨)

- Paused (부분적으로 보이지 않음) : 특정 액션을 통해서 액티비티 전환 시점에 호출

- Stopped (숨김) : 완전히 멈춤 (다음 액티비티가 수행되었을 경우 )

- Destroyed (메모리에서 사라짐)

 

 

콜백이 호출되었을 때

 

onCreate(Bundle savedInstanceState) - 정적 초기화

onStart() - 액티비티(화면)가 표시될 때

onRestart() - 액티비티가 중지된 경우 호출

onResume() - 사용자 입력을 받기 시작함

onPause() - 이전 액티비티를 재개

onStop() - 더 이상 표시되지 않지만 상태는 유지됨

onDestroy() - 안드로이드 시스템이 액티비티를 종료하기 전에 최종 호출

 

 

콜백 구현과 오버로딩

 

onCreate()만 필수!

다른 콜백함수는 기본 기능을 변경할 때 오버라이드

 

 

onCreate() : 생성됨

 

- 액티비티가 처음 생성 될 때 호출된다.

- 모든 정적 설정을 수행한다 : 뷰를 만들고 목록에 데이터를 바인딩

- 수명주기 동안 한 번만 호출된다.

- 액티비티의 이전 상태(있는 경우)가 포함된 번들(데이터)을 가져온다.

- 생성되면 항상 onStart()가 따라온다.

override fun onCreate(savedInstanceState: Bundle?){
   super.onCreate(savedInstanceState)
   // 액티비티가 생성됨
}

 

 

onStart() : 시작됨

 

- 액티비티가 사용자에게 표시될 때 호출된다.

- 수명주기 동안 두 번 이상 호출 될 수 있다.

- 액티비티가 활성화되면 onResume(), 숨겨진 경우에는 onStop()이 따라온다.

override fun onStart() {
   super.onStart()
   // 액티비티가 곧 표시됨
}

 

 

onRestart() : 시작됨

 

- 액티비티가 중지된 후, 다시 시작되기 직전에 호출된다.

- 중간(과도) 상태

- 항상 onStart()가 따라온다.

override fun onRestart() {
   super.onRestart()
   // 액티비티가 중지됨과 시작됨 사이에 있음
}

 

 

onResume() : 재개/실행

 

- 액티비티가 사용자와 상호작용하기 시작할 때 호출된다.

- 액티비티가 활동 스택의 맨 위로 이동한다.

- 사용자 입력을 시작한다.

- 실행 상태

- 항상 onPause()가 뒤에 온다.

override fun onResume() {
   super.onResume()
   // 액티비티가 화면에 표시됨 - 재개 상태
}

 

 

onPause() : 일시중지됨

 

- 시스템이 이전 액티비티를 재개하려고 할 때 호출된다.

- 활동은 부분적으로 표시되지만 사용자는 액티비티를 떠난다.

- 일반적으로 저장되지 않은 변경 사항을 영구 데이터에 적용하고 애니메이션 및 기타 리소스를 사용하는 모든 것을 중지하는 데 사용한다.

- 이 함수가 리턴할 때까지 다음 액티비티가 재개(Resume)되지 않기 때문에 실행 속도가 빠르다.

- 액티비티가 맨 앞으로 되돌아오면 onResume()이 나오고, 액티비티가 사용자에게 보이지 않는 경우에는 onStop()이 온다.

override fun onPause() {
   super.onPause()
   // 다른 액티비티가 활성화됨 - 일시중지 상태
}

 

 

onStop() : 중지됨

 

- 사용자가 액티비티를 더 이상 볼 수 없을 때 호출된다.

- 새로운 액티비티가 시작되고 기존 액티비티가 이 액티비티 앞에 나오거나 이 액티비티가 파괴되기 직전에 호출된다.

- onPause()에 너무 무거운(오래 걸리는) 연산을 실행한다.

- 액티비티가 사용자와 상호 작용하기 위해 되돌아오는 경우 onRestart() 또는 액티비티가 사라지는 경우 onDestroy() 호출한다.

override fun onStop() {
   super.onStop()
   // 이 액티비티가 더 이상 표시되지 않음 - 중지 상태
}

 

onDestroy() - 파괴됨

 

- 액티비티가 파괴되기 전에 마지막으로 호출된다.

- 사용자가 이전 액티비티 또는 구성 변경 사항으로 다시 이동한다.

- 액티비티가 완료되고 있거나 시스템이 공간을 절약하기 위해 그것을 파괴(destroy)한다.

- isFinishing() 함수를 호출해 액티비티 상태를 체크한다.

- 시스템은 이것을 호출하지 않고 Activity를 파괴할 수 있으므로 onPause() 또는 onStop()을 사용하여 데이터 또는 상태를 저장한다.

override fun onDestroy(){
   super.onDestroy()
   // 이 액티비티는 곧 파괴됨 (자주 사용되지는 않음)
}

 

 

 


 

 

 

 

2. 액티비티 인스턴스 상태 (Activity instance state)

 

구성(config)의 변경 시점 

구성은 사용자가 다음과 같은 경우 액티비티의 현재 레이아웃이나 기타 리소스를 무효화(invalidate)한다.

  • 디바이스를 회전 시
  • 시스템 언어 변경 / 지역(Locale) 변경
  • 멀티 윈도 모드 진입 (Android7 이상)

 

 

구성이 변경될 때 발생되는 일

 

1. 액티비티 종료 호출

  • onPause()
  • onStop()
  • onDestroy()

2. 다시 액티비티 시작 호출

  • onCreate()
  • onStart()
  • onResume()

 

 

액티비티 인스턴스 상태

 

- 액티비티가 실행되는 동안 카운터, 사용자 텍스트, 애니메이션 진행과 같은 상태 정보가 생성된다. (created)

- 디바이스를 회전하거나 언어를 변경하거나 뒤로 단추를 누르거나 시스템이 메모리를 지우면 상태가 사라진다.(lost)

 

 

액티비티 상태 저장 및 복원

 

시스템에서 저장해 주는 것

  • EditText에 입력된 텍스트와 같은 고유 id (android:id)가 있는 뷰의 상태
  • 시작된 액티비티의 인텐트와 Extra 데이터

그 외 액티비티 및 사용자 진행 데이터는 사용자가 직접 저장해야 한다.

 

인스턴스 상태 저장하기

 

액티비티에 onSaveInstanceState() 구현

- 액티비티가 파괴될 수 있는 상황에 런타임에서 호출

- 현재 세션의 액티비티 인스턴스에 대한 데이터만 저장한다.

override fun onSavedInstanceState(outState: Bundle?) {
   super.onSaveInstanceState(outState)
   
   //mCount값을 count에 저장
   outState.putString("count",mCount.text)
}

 

인스턴스 상태 복원

 

저장된 번들을 검색하는 두 가지 방법

onCreate(Bundle mySavedState)가 선호됨, 저장된 상태를 포함하여 사용자 인터페이스가 가능한 한 빨리 백업 및 실행되도록 하는 것이 좋다.

- 콜백 구현 (onStart() 이후에 호출됨)

onRestoreInstanceState(Bundle mySavedState)

 

// onCreate()에서 복원
override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   setContentView(R.layout.activity_main)
   mCount = findViewById<View>(R.id.show_count)
   
   if(savedInstanceState != null) {
      val count = savedInstanceState.getString("count")
      if(mCount != null){
         mCount.setText(count)
   }
}

 

인스턴스 상태와 앱 재시작

 

- 새 앱 세션을 중지했다가 다시 시작하면 액티비티 인스턴스 상태가 사라지고 액티비티가 기본 모양으로 되돌아간다.

- 앱 세션 간에 사용자 데이터를 저장해야 하는 경우 공유 환경 설정(Shared Preference) 또는 데이터베이스를 사용해야 한다.

 

 

 

 

'Android' 카테고리의 다른 글

[Android] RecyclerView  (1) 2023.08.03
[Android] Fragment 생명주기  (1) 2023.04.20
[Android] LinearLayout  (0) 2022.12.02
[Android] Layout 개요  (0) 2022.11.21
[Android] View 클래스  (0) 2022.11.20