1. Android 화면 회전, 돌려도, 돌아가도 데이터 유지 시키기
엑티비티의 경우 화면을 회전하는 경우 지워지고 다시 만들어지게 되는데 이때 액티비티에 입력되어있는 등의 정보들이 날라갈 수 있습니다. 그렇기 때문에 saveInstanceState에 돌아가기 전의 상태를 저장해두었다가 다시 OnCreate() 시 원복할 필요가 있습니다.
- 안드로이드 LifeCycle(생명주기)는 6가지의 콜백함수로 관리된다.
- 화면이 가로/세로 모드 변경될 때 onDestory() 이후 onCreate() 가 다시 불린다.
- 더 정확히는 onPause() -> onStop() -> onDestory() 로 액티비티가 종료된다.
- 이후 다시 onCreate() -> onStart() -> onResume() 을 통해 다시 실행된다.
- 더 정확히는 onPause() -> onSaveInstanceState() -> onStop() -> ...
1.1. onSaveInstanceState 로 번들에 데이터 put 하기
onSaveInstanceState 를 재정의 해주어 저는 Int 값을 저장해주었습니다. 이때 키 값은 따로 상수 값으로 빼주어 관리해주었습니다. 이때 상위(super) onSaveInstanceState 또한 호출해주어야 이후에 문제없이 동작가능합니다.
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt(STATE_PAGE, adapter.currentPageCnt - 1)
}
companion object {
...
const val STATE_PAGE = "STATE_PAGE"
}
bundle class
번들 클래스는 키-값 쌍으로 데이터를 저장할 수 있습니다. 이때 키는 문자열 값, 키와 연관시킬 값은 기본형 또는 Parcelable 인터페이스를 구현한 객체면 무엇이든 입니다!
번들 클래스는 기본적으로 기본형 데이터를 읽고 쓸 수 있는 함수를 포함하고 있습니다. 기본형, String, CharSquence 인터페이스 구현 클래스 등.
1.2. 파라미터가 2개인 onSaveInstanceState
위에서 사용한 인자가 1개인 onSaveInstanceState 함수는 화면 회전 등 시에 무조건 호출되지만 파라미터를 2개 가지는 onSaveInstanceState 함수는 API 21부터 추가 되었고 Bundle에 값이 없으면 호출되지 않는다는 차이점이 있습니다.
override fun onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle) {
super.onSaveInstanceState(outState, outPersistentState)
}
1.3. onCreate() 에서 저장된 상태 불러오기
아래 코드에서는 상태 값이 저장된 Bundle 을 onCreate 안에서 호출되는 initRecyclerView() 에 전달해서 사용했습니다. initRecyclerView() 에서 해당 savedInstanceState를 받아서 null 이 아닌 경우에는 저장된 값이 존재하는 것이므로 사용해주면됩니다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
_viewBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(viewBinding.root)
initRecyclerView(savedInstanceState)
loadInitData()
}
private fun initRecyclerView(savedInstanceState: Bundle?) {
...
savedInstanceState?.let {
adapter.currentPageCnt = it.getInt(STATE_PAGE)
}
...
}
2. onRestoreInstanceState()
또는 onRestoreInstanceState() 를 사용해서 onCreate() -> onStart() -> onRestoreInstanceState() -> onResume() 순으로 호출되는 생명주기를 활용하여 저장해두었던 상태를 불러올 수도 있습니다.
override fun onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle) {
super.onSaveInstanceState(outState, outPersistentState)
}
2.1. 기타
- 최근 EditText 의 경우에는 화면을 회전해도 데이터가 남아있도록 해주는 기능이 내장되어 있게되었습니다. (안드로이드 SDK 포함된 대부분 뷰 위젯은 상태를 복원하도록 구현이 되어 있음, super 클래스를 onRestoreInstanceState() 등 에서 호출하면 됨, 비활성화 하기를 원하면 android:saveEnabled 속성을 false로 하면된다.)
- 또는 onConfigurationChanged() 를 활용하기
- LiveData 활용해보기, jetpack의 lifecycle-aware 컴포넌트 사용해보기
2021.07.06 - [Android/Kotlin] - [Android] dp를 px로 변환해주는 융통성 있는 코드 (dp to pixel)
2021.06.30 - [Android/App] - [Android] 에어비앤비 앱 만들어 보기 (네이버 지도 api, mocky 등)
2021.06.24 - [Android/App] - [Android] 중고 거래 앱 만들기 (중고 물품 등록, 채팅, 로그인)
'Android' 카테고리의 다른 글
안드로이드 아키텍처 개요 : 전체적인 구조를 알아보자 (Android Architecture) (0) | 2021.08.06 |
---|---|
[Android] 안드로이드 4대 요소 Activity, Service, Broadcast Receiver, Content Provider 정리 🤖 (0) | 2021.07.15 |
[Android] 커스텀 뷰 에서 엑티비티 종료 시키기 (customView finish) (0) | 2021.06.23 |
[Android] 코루틴으로 url 이미지 불러오기 (String 👉 Bitmap) (1) | 2021.06.22 |
[Android] webView 에 html String Data 넣어서 불러오기 (0) | 2021.06.21 |