티스토리 뷰
Bundle
Bundle은 데이터를 저장하기 위한 객체다.
키-값 쌍으로 데이터를 저장하기 때문에, Bundle 내부에서는 Map을 사용한다.
Intent와의 차이점
Intent에서 putExtra()를 통해서도 키-값 쌍으로 저장하는데, 무슨 차이일까?
Intent의 putExtra() 내부에서도 데이터를 저장하기 위해 Bundle을 사용한다
예를 들어 putExtra() 내부 코드는 아래와 같을 것이다.
fun putExtra(name: String, value: String?): Intent {
if (mExtras == null) {
mExtras = Bundle()
}
mExtras.putString(name, value)
return this
}
두 객체 모두 Map을 사용하여 데이터를 키-값 쌍으로 저장하지만,
Intent는 Bundle을 통해서 Map에 저장하고, Bundle은 Map에 바로 저장한다는 차이가 있다.
비용적인 측면에서는 후자가, 가독성 측면에서는 전자가 나을 것이다.
이제 명확한 두 객체의 차이를 알 수 있다.
Intent는 다른 컴포넌트로 이동하는 역할을 하고, 부가적으로 데이터를 전달하는 기능을 제공한다.
Bundle은 주목적이 데이터를 저장하는 것이다.
즉, Intent는 데이터 이동, Bundle은 데이터 저장이라고 말할 수 있다.
더 자세히 Intent 내부의 Bundle을 알아보자.
Intent에 데이터를 담는 방법은 두 가지가 있다.
Intent(this, SubActivity::class.java).apply {
putExtra("str", "123")
putExtra("int", 123)
putExtra("boolean", true)
startActivity(this)
}
먼저 putExtra()를 통해 Int, String 값을 하나씩 저장하는 방법이 있다.
val str = intent.getStringExtra("str")
val i = intent.getIntExtra("int", 0)
val b = intent.getBooleanExtra("boolean", false)
---
val bundle = intent.getExtras()
val str = bundle.getString("str")
val i = bundle.getInt("int")
val b = bundle.getBoolean("boolean")
받는 쪽에서는 이렇게 하나하나씩 데이터를 가져올 수 있고, getExtras()를 호출해 Bundle 자체를 가져와
이때, getExtras()의 반환타입이 Bundle이므로 Intent 안에서 putExtra를 통해 데이터를 하나씩 저장해도 결국은 Bundle 하나를 사용한다는 것을 알 수 있다.
Intent(this, SubActivity::class.java).apply {
val bundle = Bundle().apply {
putString("str", "123")
putInt("int", 123)
putBoolean("boolean", true)
}
putExtra(bundle)
startActivity(this)
}
또한 putExtras()를 통해 Bundle을 통째로 전달하는 방법이 있다.
val bundle = intent.getExtras()
val str = bundle.getString("str")
val i = bundle.getInt("int")
val b = bundle.getBoolean("boolean")
받는 쪽에서는 getExtras()를 사용해 Bundle 자체를 가져온다.
Intent에 puExtra()를 통해 데이터를 하나하나 저장하는 방법과,
Bundle을 직접 생성해 putExtras()를 통해 모든 데이터를 한번에 저장하는 방법을 살펴봤다.
전자보다 후자가 코드량이 더 많겠지만, 비용 측면에서는 더 효율적이다.
전자는 Map.put(key, value) 호출을 여러번 하지만, 후자는 Map.putAll(map) 한번 호출하는 것과 동일하기 때문이다.
savedInstanceState: Bundle
Activity의 onCreate() 함수는 아래와 같다.
override fun onCreate(savedInstanceState: Bundle?)
이때 매개변수인 savedInstanceState의 타입이 Bundle임을 알 수 있다.
onCreate()는 화면이 세로 모드에서 가로 모드로 변경되거나 입력 타입이 변경되는 등의 화면 구성이 변경될 때 호출된다.
그럼 그때마다 액티비티의 설정값이 초기화되어 초기 화면 상태로 돌아갈까?
아니다. 초기 화면 상태로 돌아가지 않고 사용자가 보던 화면 그대로인 것을 알 수 있다.
이때 UI 설정값을 저장하는 역할을 하는 객체가 Bundle 타입의 savedInstanceState이다.
savedInstanceState가 없다면, 화면 방향이 바뀔 때마다 액티비티가 초기화될 것이다.
즉, 액티비티가 중단되고 다시 시작될 때 savedInstanceState에 저장된 데이터를 기반으로 액티비티를 생성하는 것이다.
참조
'app > android' 카테고리의 다른 글
[안드로이드/코틀린] registerForActivityResult() - activity간 데이터 전달 (0) | 2023.09.26 |
---|---|
[안드로이드/코틀린] registerForActivityResult() - 권한 요청하기 (0) | 2023.09.26 |
[안드로이드/코틀린] BroadcastReceiver 개념, 구현 방법 알아보기 (0) | 2023.09.25 |
[안드로이드/코틀린] Intent와 Intent-filter 알아보기 (0) | 2023.09.25 |
[안드로이드/코틀린] PendingIntent 개념 알아보기 (0) | 2023.09.25 |