티스토리 뷰

앱을 background 로 내린 뒤, 오랜시간 방치 후 재실행하면 저장해놓은 bundle (arguments, intent...) 이외에는 전부 날아간다.

 

Fragment

fragment manager 의 fragment 기록들도 남아있어서. 재실행시 fragment manager 를 기반으로 fragment 를 다시 그리는데, 이때 fragment 의 모든 멤버변수는 다 날아가고 onCreate() 부터 다시 실행됨 

이때 화면을 그리는데 필수적인 데이터들을 member var 로 선언해 놓으면 전부 날아가기 때문에 (fragment instance 를 새로 만드는것과 동일)

argument 에 저장해 놓고, onCreate 에서 argument 에서 불러와서 다시 초기화 해주는 것이 아니면, fragment 는 내가 원하는 화면을 그리지 못함 

 

Ex) 아래와 같이 url 을 생성자에서 받아 webview 를 로드하는 fragment 라면,

class WebViewFragment(
    private val url: String? = null
): Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.webView.loadUrl(url)
    }
}

 

이런 식으로 bundle 로 필수 변수들을 받아 세팅해 주어야, LMK로 인해 정리되어도, 재생성시 이미 저장된 bundle 을 가지고 화면을 제대로 그릴 수 있다.

class WebViewFragment: Fragment() {
    companion object {
        fun get(
            url: String? = null
        ) = WebViewFragment().apply {
            arguments = Bundle().apply {
                url?.let { putString("url", it) }
            }
        }
    }

    private var url: String? = null

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        url = arguments?.getString("url")
        binding.webView.loadUrl(url)
    }
}

 

 

 

일반적으로 ViewModel 에 저장해놓으면, 데이터는 날아가지 않는다고 하지만, LMK 의 케이스는

fragment, viewmodel 모든것을 재생성한다.

 

아래는 로그.

====> onPause() viewModel Address: com.myapp.test.WebViewModel@ed683d
====> onPause() viewModel.url: http://www.naver.com

// LMK

====> onResume() viewModel Address: com.myapp.test.WebViewModel@760b534
====> onResume() viewModel.url:

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   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
글 보관함