티스토리 뷰

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] 중고 거래 앱 만들기 (중고 물품 등록, 채팅, 로그인)

댓글
최근에 올라온 글
최근에 달린 댓글
네이버 이웃추가
«   2024/04   »
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
글 보관함