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 |