Как передать объект из одной активности в другую на 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 использует этот подход и может использоваться как ссылка.