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

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

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

Ответ 1

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

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);

Ответ 2

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

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

Ответ 3

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

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

С помощью Google библиотеки GSON вы можете напрямую проанализировать объект в форматированной строке 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, то это решение очень эффективно и экономит время.

UPDATE


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

Ответ 4

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

public class PersonHelper
{
    public static Person person;
}

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

Ответ 5

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

Ответ 6

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

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