Прямые ссылки на публичные уроки для быстрого старта и стабильной индексации lesson-страниц.
Мы уже знаем, как использовать Serializable и Parcelable для передачи объектов между Activity, а также что под капотом методов putExtra объекты упаковываются в класс Bundle. Bundle можно создавать самостоятельно напрямую — разберём этот инструмент подробнее.
В Android Bundle — это универсальный контейнер для передачи данных между компонентами: Activity, Fragment, Service и другими.
Bundle — это не просто альтернатива Parcelable и Serializable, а незаменимый элемент экосистемы Android. Многие системные функции требуют именно 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)
Когда данных много и они разных типов, удобно использовать краткую запись через bundleOf(). Пары ключ-значение передаются через ключевое слово to (тип Pair в Kotlin: первый элемент — строка-ключ, второй — данные любого типа).
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 очень просто. Поскольку методы Extra под капотом уже работают с 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)
Bundle чаще всего применяется при работе с фрагментами и при сохранении/восстановлении состояния экранов — подробнее разберём это в соответствующих уроках.
В следующем уроке погрузимся в важнейшую тему из области компонента Activity — жизненный цикл.