2010-05-25 2 views
120

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

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

ответ

133

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

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

Я решил эту проблему много лет назад, но я думал, что ваш ответ стоит принять. – mtmurdock

+0

Можете ли вы рассказать мне, как вы реализовали методы Parcelable? currentListing должен иметь тип Parcelable right? – Namratha

+0

Да, вам нужно будет реализовать интерфейс Parcelable и обеспечить реализацию. Таким образом, у него в основном есть методы для создания фактического объекта из посылки и записи данных на посылку. – anargund

36

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

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

+3

Хорошо это ново для меня. как бы я это реализовать? – mtmurdock

+0

То, что я фактически делал, делало объект защищенным членом моей активности запуска, а затем напрямую ссылался на переменную из других действий. Это не совсем ответ Эриха, но это был его ответ, который дал мне идею – mtmurdock

+0

Как вы устанавливаете подкласс приложения в качестве приложения? @mtmurdock Как вы передали экземпляр вашей первой активности другим? – Tenfour04

5

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

+0

Это, вероятно, лучшее решение, если ваши объекты не должны сохраняться в течение всего срока службы приложения (на что отвечает ответ @Erich Douglas). – mtmurdock

4

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

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

6

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

public class PersonHelper 
{ 
    public static Person person; 
} 

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

+0

Это отличное решение, но не всегда лучший выбор. Если вам не нравится Parcelable, и если ваш объект можно свести к примитивам (int, float, double, boolean) и Strings, то реализовать интерфейс Serializable очень легко. Практически никакой работы с вашей стороны и очень мало накладных расходов. – mtmurdock

+1

@mtmurdock: является ли сериализованный объект «моментальным снимком» состояния при сериализации? Мне нужно передать объект в службу, которая изменяет время выполнения службы. Служба должна всегда использовать обновленный объект, а не старый, квазикопированный объект. – stk

+1

@stk Да, объект сериализации - это моментальный снимок. Точнее, это копия, что означает, что ее изменение в одном действии не повлияет на другую деятельность, если вы не передадите ее обратно. Услуга - прекрасный способ пойти, но я могу понять, почему кто-то чувствовал, что это своего рода перебор. Еще одно решение - сохранить ваши данные, используя хранилище постоянных объектов, встроенное в Android. Он может или не подходит вашим потребностям, но если вам нужно иметь возможность получать/устанавливать значения по всему вашему приложению, это не плохое решение и может использоваться для сохранения постоянных данных. – mtmurdock

35

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

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

С Google, GSON library, вы можете непосредственно разобрать объект в отформатированную строку 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


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

  1. Eventbus
  2. Otto
+0

Это лучший ответ –

+1

Является ли сериализация для GSON эффективным? Это достаточно быстро? – osrl

+1

@osrl Для pojos, Gson работает довольно быстро. Хотя предлагается использовать решение шины событий. Пожалуйста, обратитесь к обновлению в ответе. –