[Android 개념]Fragment Life Cycle (프래그먼트 생명 주기)
Activity Life Cycle (액티비티 생명 주기)
- 사용자의 행동에 따라 앱의 Activity 인스턴스는 생명 주기 안에서 서로 다른 상태로 전환
- Activity 클래스는 활동 상태 변화를 알아차릴 수 있는 여러 콜백을 제공
액티비티 생명 주기 단계
1. onCreate()
- 시스템이 먼저 활동을 생성할 때 실행 : 필수적으로 구현
- 활동의 전체 생명 주기 동안 한 번만 발생해야 하는 기본 애플리케이션 시작 로직을 실행
- onCreate() 메서드 실행을 완료하면 시작됨 상태가 됨
- 주요 기능
- 사용자 인터페이스 선언(XML 레이아웃 파일 정의)
- 멤버 변수 정의
- 일부 UI 구성 등..
lateinit var textView: TextView
var gameState: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
// super 클래스 onCreate를 호출
super.onCreate(savedInstanceState)
// 인스턴스 상태 복구
gameState = savedInstanceState?.getString(GAME_STATE_KEY)
// 사용자 인터페이스 레이아웃 설정
// 레이아웃 파일은 프로젝트 res/layout/main_activity.xml 파일에 정의
setContentView(R.layout.main_activity)
textView = findViewById(R.id.text_view)
}
2. onStart()
- 활동이 시작됨 상태에 들어가면 호출
- 이 콜백이 호출되면 활동이 사용자에게 표시되고, 앱은 활동을 포그라운드에 보내 상호작용 할 수 있도록 준비 (ex. 앱이 UI를 관리하는 코드 초기화)
- 이 콜백이 완료되면 재개됨 상태가 됨
3. onResume()
- 활동이 재개됨 상태에 들어가면 호출
- 이 상태에 들어갔을 때 앱이 사용자와 상호작용
- 어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때까지 앱이 이 상태에 머무름
- 방해되는 이벤트가 발생하면 활동은 일시중지 상태에 들어감 -> 다시 재개됨 상태로 돌아오면 재호출
구성요소가 ON_RESUME 이벤트를 수신할 때 카메라에 액세스하는 생명 주기 인식 구성요소의 예시
class CameraComponent : LifecycleObserver {
...
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun initializeCamera() {
if (camera == null) {
getCamera()
}
}
...
}
4. onPause()
- 사용자가 활동을 떠나는 것을 나타내는 첫 번째 신호로 이 메서드를 호출
- 활동이 포그라운드에 있지 않게 되었다는 것을 나타냄
- 일부 이벤트로 인해 앱 활동 일시중지
- Android 7.0(API 수준 24) 이상에서는 여러 앱이 멀티 윈도우 모드에서 실행
- 새로운 반투명 활동(예: 대화상자)이 열릴 경우, 활동이 여전히 부분적으로 보이지만 포커스 상태가 아닌 경우에는 일시중지
class CameraComponent : LifecycleObserver {
...
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun releaseCamera() {
camera?.release()
camera = null
}
...
}
onPause()는 아주 잠깐 실행되므로 저장 작업을 실행하기에는 시간이 부족할 수 있음.
따라서 애플리케이션 또는 사용자 데이터를 저장하거나, 네트워크 호출을 하거나, 데이터베이스 트랜잭션을 실행해서는 안됨.
이러한 작업은 메서드 실행이 끝나기 전에 완료되지 못할 수도 있음
그 대신, 부하가 큰 종료 작업은 onStop() 상태일 때 실행
5. onStop()
- 활동이 사용자에게 더 이상 표시되지 않으면 해당 상태로 변경됨
- 앱이 사용자에게 보이지 않는 동안 앱은 필요하지 않은 리소스를 해제하거나 조정해야 함
- onPause() 대신 onStop()을 사용하면 사용자가 멀티 윈도우 모드에서 활동을 보고 있더라도 UI 관련 작업이 계속 진행
- CPU를 비교적 많이 소모하는 종료 작업을 실행
- 정보를 데이터베이스에 저장할 적절한 시기를 찾지 못했다면 onStop() 상태일 때 저장
- 앱이 사용자에게 보이지 않는 동안 앱은 필요하지 않은 리소스를 해제하거나 조정해야 함
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.
)
}
활동은 정지됨 상태에서 다시 시작되어 사용자와 상호작용하거나, 실행을 종료하고 사라짐
- 활동이 다시 시작되면 시스템은 onRestart()를 호출
- Activity가 실행을 종료하면 시스템은 onDestroy()를 호출
6. onDestroy()
- onDestroy()는 활동이 소멸되기 전에 호출
- (사용자가 활동을 완전히 닫거나 활동에서 finish()가 호출되어) 활동이 종료되는 경우
- 구성 변경(예: 기기 회전 또는 멀티 윈도우 모드)으로 인해 시스템이 일시적으로 활동을 소멸시키는 경우
'Android > Android 기초' 카테고리의 다른 글
[Android/Gradle]Gradle에서 APK 생성 타입 설정하기 (0) | 2023.02.24 |
---|---|
[Android/Basic]BaseActivity (0) | 2023.02.24 |
[Android/Basic]Fragment Life Cycle (프래그먼트 생명 주기) (0) | 2021.07.24 |
[Android/Basic]위치 퍼미션 (권한 설정) (0) | 2021.07.15 |
[Android/Basic]strings.xml이란?(문자열 리소스) (0) | 2021.06.09 |