Как передать объект из одной активности в другую на Android?

Мне нужно иметь возможность использовать один объект в нескольких действиях в моем приложении, и он должен быть одним и тем же объектом. Каков наилучший способ сделать это?

Я попытался сделать объект «public static», поэтому к нему могут быть доступны другие действия, но по какой-то причине это просто не разрезает его. Есть ли другой способ сделать это?

Solutions Collecting From Web of "Как передать объект из одной активности в другую на Android?"

Когда вы создаете объект намерения, вы можете использовать следующие два метода для передачи объектов между двумя действиями.

putParcelable

putSerializable

Вы можете реализовать свой класс как Parcelable, так и Serializable . Затем вы можете передавать свои пользовательские классы по всем видам деятельности. Я нашел это очень полезным.

Вот небольшой фрагмент кода, который я использую

CustomListing currentListing = new CustomListing(); Intent i = new Intent(); Bundle b = new Bundle(); b.putParcelable(Constants.CUSTOM_LISTING, currentListing); i.putExtras(b); i.setClass(this, SearchDetailsActivity.class); startActivity(i); 

И в недавно начатом коде активности будет что-то вроде этого …

 Bundle b = this.getIntent().getExtras(); if (b != null) mCurrentListing = b.getParcelable(Constants.CUSTOM_LISTING); 

Вы можете создать подкласс приложения и сохранить там свой общий объект. Объект Application должен существовать в течение всего срока действия вашего приложения, если имеется какой-либо активный компонент.

Из ваших действий вы можете получить доступ к объекту приложения через getApplication() .

Этот ответ специфичен для ситуаций, когда объекты, подлежащие передаче, имеют вложенную структуру классов. С вложенной структурой класса создание Parcelable или Serializeable немного утомительно. И процесс сериализации объекта неэффективен для Android . Рассмотрим пример ниже,

 class Myclass { int a; class SubClass { int b; } } 

С помощью библиотеки GSON от Google вы можете напрямую анализировать объект в форматированной строке JSON и преобразовывать его обратно в формат объекта после использования. Например,

 MyClass src = new MyClass(); Gson gS = new Gson(); String target = gS.toJson(src); // Converts the object to a JSON String 

Теперь вы можете передать эту строку через действия как StringExtra с намерением активности.

 Intent i = new Intent(FromActivity.this, ToActivity.class); i.putExtra("MyObjectAsString", target); 

Затем в принимающей операции создайте исходный объект из строкового представления.

 String target = getIntent().getStringExtra("MyObjectAsString"); MyClass src = gS.fromJson(target, MyClass.class); // Converts the JSON String to an Object 

Он сохраняет исходные классы чистыми и многоразовыми. Прежде всего, если эти объекты класса создаются из Интернета как объекты JSON, то это решение очень эффективно и экономит время.

ОБНОВИТЬ


Хотя описанный выше метод работает для большинства ситуаций, по очевидным причинам производительности, не полагайтесь на дополнительную систему Android для дополнительных объектов. Есть ряд решений, которые делают этот процесс гибким и эффективным, вот несколько. У каждого есть свои плюсы и минусы.

  1. Eventbus
  2. эфирное масло

Это зависит от типа данных, к которым вам нужен доступ. Если у вас есть какой-то пул данных, который должен сохраняться через Activity s, то ответ Erich – это путь. Если вам просто нужно передать несколько объектов из одной активности в другую, вы можете заставить их реализовать Serializable и передать их в дополнение к Intent чтобы начать новую Activity .

Возможно, это непопулярный ответ, но в прошлом я просто использовал класс, который имеет статическую ссылку на объект, который я хочу сохранить через действия. Так,

 public class PersonHelper { public static Person person; } 

Я попытался спуститься по интерфейсу Parcelable, но столкнулся с рядом проблем, и накладные расходы в вашем коде были непривлекательны для меня.

Ваш объект также может реализовать интерфейс Parcelable. Затем вы можете использовать метод Bundle.putParcelable() и передать свой объект между действиями в рамках намерения.

Приложение Photostream использует этот подход и может использоваться как ссылка.