일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- DataStructure
- 보늬밤
- 피요모리2
- AfxMessageBox
- Dokka
- darkmode
- math
- memory
- DynamicProgramming
- 쌓기게임
- QoS
- WebView
- devicedriver
- 형변환
- 리틀포레스트
- LRU
- SPI
- synergy
- MFC
- Java
- FirebaseAuth
- Dialog
- stack
- Kotlin
- 피보나치
- Collection
- android
- 동적프로그래밍
- 코인거스름돈
- 제곱근
- Today
- Total
퉁탕퉁탕 만들어보자
onSaveInstanceState 는 어떻게 사용하지? 본문
맨 처음 Activity를 만들면 onCreate()의 인수로 savedInstanceState가 넘어오는것을 보고 이건 무엇일까? 생각하게된다.
override fun onCreate(savedInstanceState: Bundle?)
Framework는 Activity가 예상치 못하게 종료되는 경우를 대비해서 onSaveInstanceState를 호출해줘서 이때 여기서 필요한 정보를 저장하고, Acticity가 재시작될 때 이때 저장된 bundle을 onCreate 또는 onRestoreInstanceState 에서 처리를 해줄수 있게 해준다.
그러면 onSaveInstanceState가 언제 불리는지를 알아야한다.
바로바로 Activity가 정지될때 불린다. 하지만 user가 Activity를 명시적으로 끝낼때는 불리지 않는다. - 백키 종료랑, finish() 함수를 통해서 destory될 때다. 생명주기 callback들 간의 순서는 targetSdkVersion에 따라 다른데, 11미만에서는 onPause()이전이고 그 이상에서는 onStop()전에 불린다.
그러면 bundle에는 무엇을 저장할까?
좀 중요하고 영구적으로 남겨야되는 data들은 db나 sharedpreference를 이용해서 onStop에서 저장을 처리해주고
간단한 ui 정보들을 bundle로 키-밸류 쌍으로 저장해서 활용한다.
예제) onSaveInstanceState를 활용해서 data저장하기
override fun onSaveInstanceState(outState: Bundle?) {
outState?.run {
putInt(STATE_SCORE, currentScore)
putInt(STATE_LEVEL, currentLevel)
}
super.onSaveInstanceState(outState)
}
companion object {
val STATE_SCORE = "playerScore"
val STATE_LEVEL = "playerLevel"
}
예제) onCreate에서 savedInstanceState처리하기
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// saveInstanceState는 null일 수 있다. 있을때만 처리해준다.
if (savedInstanceState != null) {
with(savedInstanceState) {
// 값 복원해주기
currentScore = getInt(STATE_SCORE)
currentLevel = getInt(STATE_LEVEL)
}
} else {
//새로운 instance에서 필요한 initialize작업을 수행한다
}
}
onCreate대신에 onRestoreInstanceState에서 처리도 가능하다. 순서는 onStart 다음에 불린다. 또한 Bundle이 반드시 있을때만 불리니까 onRestoreInstanceState에서 처리하는게 좀더 깔끔할수 있겠다.
override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
super.onRestoreInstanceState(savedInstanceState)
// 값 복원해주기
savedInstanceState?.run {
currentScore = getInt(STATE_SCORE)
currentLevel = getInt(STATE_LEVEL)
}
}
*만약 Activity가 탑에 있지 않은경우에도 onSavedInstanceState가 불릴까? 그렇지않다. 이미 위에 누군가 올라가서 덮이게 될때 onSavedInstanceState가 이미 불리게 된다. 홈버튼이나 화면꺼짐, 화면회전이 일어나면 제일 위에 있는 Activity에서만 onSavedInstanceState가 불리게 된다.
'Computer > Android' 카테고리의 다른 글
Android 시스템 Setting의 값 읽기/쓰기 (0) | 2022.04.16 |
---|---|
내 Activity에서 볼륨 변경을 어떻게 알 수 있을까?(System content observer) (0) | 2022.04.15 |
Activity 화면 전환 시 onConfigurationChanged에서 처리하기 (0) | 2022.04.10 |
Activity Lifecycle (0) | 2022.04.10 |
Android WebView에 Darkmode 적용하기 (0) | 2021.06.28 |