Популярно, доступно, полезно

Передача данных между Activity Android


Предисловие

Начиная работу с андроид, одной из основных проблем, с которой обычно сталкиваются разработчики — передача данных между Activity Android, Fragments, Services и т.д. Некоторые решают проблему размещением данных в памяти или наиболее распространенным решением — хранят все переменные и/или объекты в экземплярe Application 😵

Как они это делают?

Стандартный способ, с помощью которого осуществляется передача данных между Activity Android — это использование Intent/Bundle. Когда вы отправляете информацию между Activities/Receivers/Services, это означает, что они будут сериализованы (преобразованы в массив байтов) и десериализованы (из байтового массива) при получении. Обратите внимание, что только определенные типы данных считаются Parcelable, и они явно прописаны в Bundle API.

В пункте назначения у вас всегда будут Deep copies (глубокие копии) ваших данных/объектов.

Практика совершенствует 👍

В общем, чтобы передать свои собственные объекты, вы должны реализовать либо Serializable (пожалуйста, не надо) ,либо Parcelable. Если нет, значения каждого поля должны передаваться отдельно, что превращается в большой объем ручной работы.

Объект Foo не реализует интерфейс Parcelable, поэтому нет десериализации или сериализации информации. Создаем новую активность и передаем отдельно значения полей из Foo:

Если у Foo есть реализация Parcelable, то передача данных между Activity android становится совсем простой задачей:

Вы можете создать реализацию Parcelable по умолчанию либо на parcelabler.com, либо использовать плагин AS: ищите по запросу «Android Parcelable».

Примечание: в Parcelable порядок имеет значение. Если вы сделаете какие-либо изменения вручную, то убедитесь что все сделали правильно:

Получение данных

Доступ к переданным данным аналогичен (буквально) получению их из бандла. Наиболее важным аспектом является использование одних и тех же ключей при доступе к данным, независимо от того, какому компоненту вы их передаете.

Activities получают доступ к содержанию Intent, вызывая метод getIntent().getExtras(), который вернет Bundle с переданной информацией.

С другой стороны, если вы используете фрагменты,в которые передаете данные, создайте бандл и передайте его в качестве аргументов фрагменту:

Получение этих данных в экземпляре фрагмента:

String passedString = getArguments().getString("keySomeValue"));

Альтернативы

Есть несколько проверенных библиотек, которые облегчают этот процесс

  • EventBus: библиотека с открытым исходным кодом для Андроид, использующая шаблон publisher/subscriber. EventBus обеспечивает централизованное взаимодействие между отделенными классами с помощью всего лишь нескольких строк кода — упрощение кода, удаление зависимостей и ускорение разработки приложений.
  • Otto: это шина событий, предназначенная для разделения различных частей вашего приложения, позволяя им эффективно взаимодействовать. Созданный на основе Guava, Otto добавляет уникальную функциональность к уже усовершенствованной шине событий, а также адаптирует ее под платформу Android.
  • RxJava: быстрый поиск в Google покажет много различных вариантов использование RxJava, один из которых в качестве шины. Библиотека была разработана не конкретно для этой задачи, но с ней справляется. Тем не менее,я бы не рекомендовал использовать RxJava только в качестве шины.

Перевод статьи Joaquim Ley Passing data in Android

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *