Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 백준16234
- 전기 요금
- 124 나라의 숫자
- 백준5710
- 백준 2564
- 빙산
- 부스트캠프
- 백준12904
- 경비원
- 백준
- 프로그래머스
- 완주하지 못한 선수
- 백준1339
- 피보나치 수의 확장
- 백준1697
- 백준3190
- 백준16954
- 코딩테스트
- A와 B
- 백준 14499
- 소수 만들기
- 백준1788
- 키패드 누르기
- 단어 수학
- 움직이는 미로 탈출
- 파이썬
- 백준2573
- 로또의 최고 순위와 최저 순위
- 인구 이동
- Smart Commit
Archives
- Today
- Total
Today.dev
액티비티 생명 주기 본문
콜백은 상태 변화에 적합한 특정 작업을 실행할 수 있도록 한다. 적시에 알맞은 작업을 하고 적절하게 전환을 처리하면 앱이 더욱 안정적으로 기능할 수 있다.
- 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) }
- onStart()
- 해당 메서드가 호출되면 액티비티가 사용자에게 보여지고 앱은 액티비티를 foreground 에 보내 상호작용할 수 있도록 준비한다.
- 앱이 UI 를 관리하는 코드를 초기화한다.
- onResume()
- 해당 메서드가 호출되었을 때 어플리케이션이 사용자와 상호작용한다.
- 어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때 까지 앱이 이상태에 머무른다.
- ex) 전화, 다른 활동으로 이동, 기기 화면 종료
- onResume() 을 구현하여 onPause() 중에 해제하는 구성요소를 초기화하고, 활동이 재개됨 상태로 전활될 때마다 필요한 다른 초기화 작업도 수행해야 한다.
-
class CameraComponent : LifecycleObserver { ... // RESUME 상태에서 카메라 초기화 작업 수행 @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun initializeCamera() { if (camera == null) { getCamera() } } ... }
- 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 상태에 있다.
- 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 객체는 메모리에 저장된다.
- onDestroy()
- 시스템은 다음중 하나에 해당할 때 해당 콜백을 호출한다. (isFinishing() 메서드로 구분 가능)
- (사용자가 액티비티를 완전히 닫거나 액티비티에서 finish() 가 호출되어 액티비티가 종료되는 경우 → 액티비티가 수신하는 마지막 수명 주기 콜백이 됨
- 기기 회전 또는 멀티윈도우 모드로 인해 시스템이 일시적으로 액티비티를 소멸시키는 경우 → 시스템이 즉시 새 활동 인스턴스를 생성하고 onCreate() 가 호출됨
- ViewModel 객체를 이용하여 액티비티의 뷰 데이터를 저장해야 한다.
- 시스템은 다음중 하나에 해당할 때 해당 콜백을 호출한다. (isFinishing() 메서드로 구분 가능)
출처
'안드로이드 > 개발' 카테고리의 다른 글
API KEY 관리 (0) | 2021.06.23 |
---|
Comments