Урок 16: Как создать и передать Bundle объект 

Урок 16: Как создать и передать Bundle объект 

Передача данных через Bundle объект

Великолепно! Мы только что узнали, как использовать Serializable и Parcelable для передачи объектов между Activity. Также мы уже знаем, что под капотом методов putExtra объекты упаковываются в класс Bundle. А еще я говорил, что мы можем создавать такие объекты самостоятельно напрямую. Настало время поговорить подробнее про этот мощный инструмент.

В Android Bundle — это универсальный контейнер для передачи данных между компонентами, такими как Activity, Fragment, Service и так далее.

Почему мы должны уделить внимание Bundle, если уже знаем о Parcelable и Serializable? Ну, дело в том, что Bundle — это не просто альтернатива, а скорее незаменимый элемент экосистемы Android, который предлагает дополнительные возможности и преимущества. Многие системные функции и методы Android требуют именно Bundle для передачи данных.

Вы часто будете работать с Bundle при взаимодействии с фрагментами или при сохранении и восстановлении состояния экранов. Этих примеров мы коснемся, когда будем изучать фрагменты. Сейчас только ограничимся демонстрацией создания наборов бандлов и передачи их между нашими экранами.

Как создать и передать Bundle объект

Приступим к созданию Bundle. Как это работает.

  1. Создаем сам объект val bundle = Bundle().
  2. Добавляем в него произвольный набор данных по отдельности. Для каждого типа данных используется отдельный метод. Я буду отправлять те же данные, поэтому методы будут putString, putInt, putSerializable, а также может быть putParcelable соответственно.
  3. Далее обращаюсь к переменной интента и вызываю метод putExtras. Обращаю внимание на s в конце – это другой метод, он принимает один параметр Bundle.
  4. В конце все остается то же самое. Вызывается старт Активити с интентом в качестве параметра.
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 – жизненный цикл.

Бесплатные Telegram-боты для обучения

Практика с проверкой кода и помощью ИИ-ментора

AndroidSprint AI Mentor

Проверяет Pull Request'ы в GitHub, проводит тестовые собеседования с голосом и таймером, помогает разбираться с кодом 24/7

Попробовать ИИ-ментора →

KotlinSprint Bot

22 урока Kotlin, 220 тестов, 120 практических задач с код-ревью

Начать обучение Kotlin →

AndroidSprint Bot

Тесты по Android SDK, Jetpack Compose, архитектуре приложений

Тесты по Android →

Бесплатная диагностика с сениор разработчиком

Запишитесь на консультацию — перезвоним в рабочие часы

Или свяжитесь удобным способом

Вам также может быть интересно

Узнать подробнее
Курс AndroidSprint

Глубокое обучение Android разработке с 0 до получения оффера. Только персональная практика с гарантией получения продуктового опыта.

Курс AndroidSprint - Глубокое <strong>обучение Android разработке с 0 до получения оффера</strong>. Только персональная практика с гарантией получения продуктового опыта.
Узнать подробнее
Узнать подробнее
Практикум по Kotlin

Изучение Котлин с 0 для профессиональной разработки. Личный ментор и разбор кода задач через git-flow.

Практикум по Kotlin - Изучение Котлин <strong>с 0 для профессиональной разработки</strong>. Личный ментор и разбор кода задач через git-flow.
Узнать подробнее
Узнать подробнее
Бесплатные уроки по Kotlin разработке

Самостоятельное освоение базы по языку для дальнейшего развития в Android/back-end разработке или в автотестах.

Бесплатные уроки по Kotlin разработке - <span>Самостоятельное освоение базы по языку для дальнейшего развития в Android/back-end разработке или в автотестах.</span>
Узнать подробнее
Узнать подробнее
Onboarding в разработку

Полное обучение Android разработке с нуля до получения оффера. Делаем упор на практику и обратную связь

Onboarding в разработку - <span>Полное обучение Android разработке с нуля до получения оффера. Делаем упор на практику и обратную связь</span>
Узнать подробнее
Узнать подробнее
Обучающий Kotlin телеграм бот (с тестами)

Ваш основной инструмент для изучения основ языка. Бесплатные тесты и практика внутри.

Обучающий Kotlin телеграм бот (с тестами) - Ваш основной <span>инструмент для изучения основ языка.</span> Бесплатные тесты и практика внутри.
Узнать подробнее
Узнать подробнее
Бесплатные уроки по Android разработке

Самостоятельное обучение разработке Андроид приложений. Понятные видеоуроки с разжеванными примерами.

Бесплатные уроки  по Android разработке - Самостоятельное <span>обучение разработке Андроид приложений.</span> Понятные видеоуроки с разжеванными примерами.
Узнать подробнее
Узнать подробнее
Курс по UI/Unit тестированию

Для ручных тестировщиков, которые готовы осваивать автотесты с использованием актуального стека технологий. [в разработке]

Курс по UI/Unit тестированию - Для ручных тестировщиков, которые <span>готовы осваивать автотесты</span> с использованием актуального стека технологий. [в разработке]
Узнать подробнее
Узнать подробнее
Обучающий Android телеграм бот (с тестами)

Бесплатные теоретические тесты для самопроверки. А также информер на практических спринтах по Android.

Обучающий Android телеграм бот (с тестами) - Бесплатные <span>теоретические тесты для самопроверки.</span> А также информер на практических спринтах по Android.
Узнать подробнее
ИИ-ментор код-ревью и голосовые собесы
Открыть