Смотрите видеоурок бесплатно на удобной для вас платформе:
Передача данных через Bundle объект
Великолепно! Мы только что узнали, как использовать Serializable
и Parcelable
для передачи объектов между Activity
. Также мы уже знаем, что под капотом методов putExtra
объекты упаковываются в класс Bundle
. А еще я говорил, что мы можем создавать такие объекты самостоятельно напрямую. Настало время поговорить подробнее про этот мощный инструмент.
В Android Bundle
— это универсальный контейнер для передачи данных между компонентами, такими как Activity
, Fragment
, Service
и так далее.
Почему мы должны уделить внимание Bundle
, если уже знаем о Parcelable
и Serializable
? Ну, дело в том, что Bundle
— это не просто альтернатива, а скорее незаменимый элемент экосистемы Android, который предлагает дополнительные возможности и преимущества. Многие системные функции и методы Android требуют именно Bundle
для передачи данных.
Вы часто будете работать с Bundle
при взаимодействии с фрагментами или при сохранении и восстановлении состояния экранов. Этих примеров мы коснемся, когда будем изучать фрагменты. Сейчас только ограничимся демонстрацией создания наборов бандлов и передачи их между нашими экранами.
Как создать и передать Bundle объект
Приступим к созданию Bundle
. Как это работает.
- Создаем сам объект
val bundle = Bundle()
. - Добавляем в него произвольный набор данных по отдельности. Для каждого типа данных используется отдельный метод. Я буду отправлять те же данные, поэтому методы будут
putString
,putInt
,putSerializable
, а также может бытьputParcelable
соответственно. - Далее обращаюсь к переменной интента и вызываю метод
putExtras
. Обращаю внимание наs
в конце – это другой метод, он принимает один параметр Bundle. - В конце все остается то же самое. Вызывается старт Активити с интентом в качестве параметра.
val bundle = Bundle()
bundle.putString("EXTRA_KEY_TEXT", "don't panic")
bundle.putInt("EXTRA_KEY_NUMBER", 42)
bundle.putSerializable("EXTRA_KEY_WORD", word)
intent.putExtras(bundle)
startActivity(intent)
Бандл вообще актуально использовать как раз, когда данных много и они разные. И для этих случаев есть короткая запись создания набора этих объектов. Для этого я не буду все создавать по отдельности, а внутри putExtras
вместо объекта вызову метод bundleOf()
. В него передам те же пары ключ-значение, но в более компактной форме.
Для пары в Котлин существует соответствующий тип Pair
. В сигнатуре видно, что первый тип строка – это ключ. Второй тип – любой тип передаваемых данных. Записываются они через ключевое слово to
.
intent.putExtras(
bundleOf(
"EXTRA_KEY_TEXT" to "don't panic",
"EXTRA_KEY_NUMBER" to 42,
"EXTRA_KEY_WORD" to word,
)
)
startActivity(intent)
Кстати, выше вызов putExtra можно тоже подсократить с помощью scope-функции apply. Таким образом методы будут применяться сразу к созданному объекту интента и сохранятся в переменную intent.
val intent = Intent(this, SecondDemoActivity::class.java).apply {
putExtra("EXTRA_KEY_TEXT", "don't panic")
putExtra("EXTRA_KEY_NUMBER", 42)
putExtra("EXTRA_KEY_WORD", word)
}
Как получить Bundle объект в Activity
Окей. Получить Bundle в другой Activity очень просто. Технически, чтобы получить сами значения вообще ничего делать ненадо. Помним, что методы экстра под капотом уже работают с Bundle. Поэтому все способы получения Extra у проперти intent остаются рабочими.
Если вы передаете много данных и хотите работать с ними централизованно, может быть удобнее получить весь Bundle
и извлекать значения из него. Например, вот так:
val bundle = intent.extras
val text = bundle?.getString("EXTRA_KEY_TEXT")
val number = bundle?.getInt("EXTRA_KEY_NUMBER")
val word = bundle?.getParcelable("EXTRA_KEY_WORD", ExtraWord::class.java)
Здесь я сначала извлекаю объект бандла, а затем достаю нужные мне значения в зависимости от типа. Как вы понимаете все по большей части идентично.
Отлично. Сейчас мы научились правильно передавать объекты между Activity. На самом деле Bundle мы будем чаще использовать при взаимодействии с фрагментами, а также при сохранении и восстановлении состояния экранов. Поговорим об этом подробнее в соответствующих уроках.
И это конец. Ну а закрепить теорию по этому уроку вы можете с помощью бесплатных тестов в телеграм боте по ссылке под видео. Бот, который посвящен только материалам по Android, заходите, посмотрите.
В следующем уроке погрузимся в важнейшую тему из области компонента Activity – жизненный цикл.
Для тех, кто собрался стать Android-разработчиком
Пошаговая
схема
Описание процесса обучения от основ Kotlin до Android-разработчика
Бесплатные
уроки
Авторский бесплатный курс по основам языка программирования Kotlin
Обучающий
бот
Тренажер и самоучитель по Котлин – бесплатные тесты и практика