Я пытаюсь отправить объект моего класса клиентов из одного Activity
и показать его в другом Activity
.
Код для класса клиента:
public class Customer {
private String firstName, lastName, Address;
int Age;
public Customer(String fname, String lname, int age, String address) {
firstName = fname;
lastName = lname;
Age = age;
Address = address;
}
public String printValues() {
String data = null;
data = "First Name :" + firstName + " Last Name :" + lastName
+ " Age : " + Age + " Address : " + Address;
return data;
}
}
Я хочу отправить свой объект от одного Activity
к другому, а затем отобразить данные на другом Activity
.
Как я могу этого достичь?
Ответы:
Один из вариантов может позволить вашему пользовательскому классу реализовать
Serializable
интерфейс, а затем вы можете передать экземпляры объекта в намерение дополнительно, используяputExtra(Serializable..)
вариантIntent#putExtra()
метода.Псевдокод :
Примечание. Убедитесь, что в каждом вложенном классе вашего основного пользовательского класса реализован интерфейс Serializable, чтобы избежать любых исключений сериализации. Например:
источник
Parcelable
IS разработан специально для этой цели (и гораздо быстрее , чемSerializable
). Я в замешательстве.Parcelable
может быть хорошо для скорости, но это сложно реализовать. Что если у вас есть 8 объектов, которые вам нужно передать между действиями, собираетесь ли вы создавать каждый из нихParcelable
? Было бы разумнее использоватьSerializable
вместо этого. Когда вы реализуете,Parcelable
вы должны добавить много кода в класс и упорядочить поля очень специфическим образом;Serializable
ты не В конечном счете, я думаю, что все сводится к тому, сколько объектов вы проходите и что вы пытаетесь сделать.Serializable
стандартный интерфейс Java Вы просто помечаете класс Serializable, реализуя интерфейс, и Java автоматически сериализует его в определенных ситуациях.Parcelable
это специальный интерфейс для Android, где вы реализуете сериализацию самостоятельно. Он был создан, чтобы быть намного более эффективным, чем Serializable, и обойти некоторые проблемы со стандартной сериализационной схемой JavaРеализуйте свой класс с Serializable. Давайте предположим, что это ваш класс сущности:
Мы отправляем объект, вызванный
dene
из X Activity в Y Activity. Где-то в X деятельности;В Y деятельности мы получаем объект.
Вот и все.
источник
classCastException: java.lang.Long
от этого. Не могли бы вы объяснить, почему?(Serializable)
к объекту?Вы можете создать Parcelable код для вашего класса, используя этот сайт .
источник
Parcelable
я бы предпочел, чтобы мои классы POJO не зависели от Android и не использовалисьSerializable
.Используйте gson, чтобы преобразовать ваш объект в JSON и передать его через намерение. В новом Activity конвертируйте JSON в объект.
В вашем
build.gradle
, добавьте это к вашим зависимостямВ своей деятельности преобразуйте объект в json-строку:
Получив Activity, преобразуйте json-строку обратно в исходный объект:
Для Котлина это то же самое
Передать данные
Получить данные
источник
Во время вызова деятельности
В toClass.java получать активность по
Пожалуйста, убедитесь, что класс клиента реализует
источник
По моему опыту есть три основных решения, каждое со своими недостатками и преимуществами:
Реализация Parcelable
Реализация Сериализуемый
Использование некоторой облегченной библиотеки шины событий (например, EventBus от Greenrobot или Otto от Square)
Parcelable - быстрый и стандартный для Android, но он имеет много стандартного кода и требует жестко закодированных строк для справки при извлечении значений из намерения (не строго типизированного).
Сериализуемый - близкий к нулю шаблон, но это самый медленный подход, который также требует жестко закодированных строк при извлечении значений из намерения (не строго типизированных).
Шина событий - нулевой шаблон, самый быстрый подход и не требует жестко закодированных строк, но требует дополнительной зависимости (хотя обычно и небольшой, ~ 40 КБ)
Я опубликовал очень подробное сравнение этих трех подходов, включая критерии эффективности.
источник
Я нашел простой и элегантный метод:
Способ 1
Код для первого занятия:
Код для второго занятия:
вы найдете
objSent
иobjReceived
получите то же самоеhashCode
, поэтому они идентичны.Но почему мы можем передать объект Java таким образом?
На самом деле, связыватель Android создаст глобальную ссылку JNI для объекта Java и выпустит эту глобальную ссылку JNI, если для этого объекта Java нет ссылки. binder сохранит эту глобальную ссылку JNI в объекте Binder.
* ВНИМАНИЕ: этот метод работает ТОЛЬКО в том случае, если два действия выполняются в одном и том же процессе, в противном случае генерируется исключение ClassCastException в (ObjectWrapperForBinder) getIntent (). GetExtras (). GetBinder ("object_value") *
определение класса ObjectWrapperForBinder
Способ 2
Но у метода 2 есть небольшая, но серьезная проблема: если получателю не удается восстановить объект Java (например, какое-то исключение происходит до восстановления объекта Java, или действие получателя вообще не существует), тогда объект Java станет утечка памяти или утечка памяти, метод 1 не имеет этой проблемы, потому что Android Binder будет обрабатывать это исключение
Способ 3
Для удаленного вызова Java-объекта мы создадим контракт данных / интерфейс для описания Java-объекта. Мы будем использовать файл aidl.
IDataContract.aidl
Код для первого занятия
Код для второго занятия:
измените атрибут android: process в AndroidManifest.xml на непустое имя процесса, чтобы убедиться, что второе действие выполняется в другом процессе
Таким образом, мы можем передавать интерфейс между двумя действиями, даже если они выполняются в разных процессах, и вызывать метод интерфейса удаленно
Способ 4
Метод 3 кажется недостаточно простым, потому что мы должны реализовать вспомогательный интерфейс. Если вы просто хотите выполнить простую задачу, а возвращаемое значение метода не нужно, мы можем использовать android.os.Messenger
Код для первого действия (отправитель):
Код для второго действия (получатель):
Весь Messenger.send будет выполняться в обработчике асинхронно и последовательно.
На самом деле, android.os.Messenger также является вспомогательным интерфейсом, если у вас есть исходный код Android, вы можете найти файл с именем IMessenger.aidl
источник
Вы также можете записать данные объекта во временные строки и целые и передать их в действие. Конечно, таким образом вы получаете транспортируемые данные, но не сам объект.
Но если вы просто хотите отобразить их, а не использовать объект в другом методе или что-то в этом роде, этого должно быть достаточно. Я сделал это так же, чтобы просто отобразить данные из одного объекта в другой деятельности.
Вы также можете передать их напрямую вместо временных иваров, но, на мой взгляд, так будет понятнее. Кроме того, вы можете установить для временных ивров значение null, чтобы они быстрее очищались сборщиком мусора.
Удачи!
На заметку: переписать toString () вместо написания собственного метода печати.
Как упомянуто в комментариях ниже, вот как вы вернете свои данные в другой деятельности:
источник
Bundle extras = getIntent().getExtras();
String val = extras.getString("fname");
Я создал одноэлементный вспомогательный класс, который содержит временные объекты.
Вместо того, чтобы помещать ваши объекты в Intent, используйте IntentHelper:
Внутри вашей новой деятельности вы можете получить объект:
Имейте в виду, что после загрузки объект удаляется, чтобы избежать ненужных ссылок.
источник
BookActivity.getInstance().recommendationResponse
вRoomsActivity
obj
становитсяnull
. Чтобы этого избежать,obj
нужно где-то хранить, чтобы получить его снова. Действительно, решение Json хранит данные объекта в Intent.Есть несколько способов получить доступ к переменным или объектам в других классах или Activity.
А. База данных
Б. Общие предпочтения.
C. Сериализация объектов.
D. Класс, который может содержать общие данные, может называться Common Utilities. Это зависит от тебя.
E. Передача данных через Intents и Parcelable Interface.
Это зависит от потребностей вашего проекта.
А. База данных
SQLite - это база данных с открытым исходным кодом, встроенная в Android. SQLite поддерживает стандартные функции реляционной базы данных, такие как синтаксис SQL, транзакции и подготовленные операторы.
Учебники
Б. Общие предпочтения
Предположим, вы хотите сохранить имя пользователя. Так что теперь будет две вещи: ключевое имя пользователя и значение значения.
Как хранить
Используя putString (), putBoolean (), putInt (), putFloat () и putLong (), вы можете сохранить желаемый тип данных.
Как получить
http://developer.android.com/reference/android/content/SharedPreferences.html
C. Сериализация объекта
Объектная серизация используется, если мы хотим сохранить состояние объекта, чтобы отправить его по сети, или вы также можете использовать его для своих целей.
Используйте Java-бины и сохраняйте их как одно из его полей, а для этого используйте getter и setter.
JavaBeans - это классы Java, которые имеют свойства. Думайте о свойствах как о частных переменных экземпляра. Поскольку они закрыты, единственный доступ к ним за пределами их класса - через методы в классе. Методы, которые изменяют значение свойства, называются методами установки, а методы, которые извлекают значение свойства, называются методами получения.
Установите переменную в вашем почтовом методе, используя
Затем используйте сериализацию объекта для сериализации этого объекта, а в другом классе десериализуйте этот объект.
При сериализации объект может быть представлен в виде последовательности байтов, которая включает в себя данные объекта, а также информацию о типе объекта и типах данных, хранящихся в объекте.
После записи в файл сериализованного объекта его можно прочитать из файла и десериализовать. То есть информация о типе и байты, которые представляют объект и его данные, могут использоваться для воссоздания объекта в памяти.
Если вы хотите учебник для этого обратитесь к:
Сериализация в Java (сообщение в блоге)
Получить переменную в других классах (переполнение стека)
D. Общие коммунальные услуги
Вы можете создать класс самостоятельно, который может содержать общие данные, которые вам часто нужны в вашем проекте.
Образец
E. Передача данных через намерения
Пожалуйста, обратитесь к учебнику Android - Данные посылки для передачи между действиями с использованием классов Parcelable для этой опции передачи данных.
источник
Создайте свой собственный класс
Customer
следующим образом:В вашем
onCreate()
методеВ
xyz activity
классе вам нужно использовать следующий код:источник
Лучший способ - это иметь класс (назовите его Control) в вашем приложении, который будет содержать статическую переменную типа «Клиент» (в вашем случае). Инициализируйте переменную в вашей деятельности А.
Например:
Затем перейдите к занятию B и получите его из класса Control. Не забудьте присвоить значение null после использования переменной, иначе память будет потрачена впустую.
источник
Теперь вы хотите передать объект этого класса в startActivity. Просто используйте это:
Это работает здесь, потому что MyClass реализует
Serializable
.источник
Если вы решите использовать способ, описанный Samuh, помните, что отправлять можно только примитивные значения. То есть значения, которые могут быть пересчитаны. Таким образом, если ваш объект содержит сложные объекты, они не будут следовать. Например, такие переменные, как Bitmap, HashMap и т. Д. Их сложно передать намерением.
В общем , я бы посоветовал вам послать только примитивные типы данных в качестве статистов, как String, Int, логическое и т.д. В вашем случае это будет:
String fname
,String lname
,int age
, иString address
.Мое мнение: более сложные объекты лучше использовать совместно с помощью ContentProvider , SDCard и т. Д. Также можно использовать статическую переменную , но это может быстро привести к подверженному ошибкам коду ...
Но опять же, это только мое субъективное мнение.
источник
Я использую parcelable для отправки данных из одного вида деятельности в другой. Вот мой код, который отлично работает в моем проекте.
В деятельности A используйте это так:
В ActivityB используйте это так, чтобы получить данные:
источник
Вы можете попробовать использовать этот класс. Ограничение заключается в том, что его нельзя использовать вне одного процесса.
Один вид деятельности:
Другая деятельность:
источник
Запустите другое действие из этого действия и передайте параметры через Bundle Object
Получить данные о другой деятельности (YourActivity)
Это нормально для простого типа данных. Но если вы хотите передавать сложные данные между действиями. Вам нужно сначала сериализовать его.
Здесь у нас есть модель сотрудника
Вы можете использовать Gson lib, предоставленный Google, для сериализации сложных данных, подобных этой
источник
Этот вопрос также обсуждается в другом вопросе переполнения стека. Пожалуйста, обратите внимание на решение для передачи данных через намерение с использованием Serializable . Суть в том, чтобы использовать
Bundle
объект, который хранит необходимые данные внутриIntent
.Чтобы извлечь значения:
Преимущество
Serializable
заключается в его простоте. Однако вы должны рассмотреть возможность использованияParcelable
метода, если вам нужно перенести много данных, потому чтоParcelable
он специально разработан для Android и более эффективен, чемSerializable
. Вы можете создатьParcelable
класс, используя:источник
Создайте класс, такой как bean-класс, и реализуйте
Serializable
интерфейс. Затем мы можем передать его черезintent
метод, например:Затем получите это из другой деятельности, например:
источник
Создайте два метода в своем пользовательском классе, как это
Теперь в вашем отправителе Активность делайте так
И в вашем ресивере
источник
Да, использование статического объекта - безусловно, самый простой способ сделать это с пользовательскими несериализуемыми объектами.
источник
static
- лучший обходной путь, если просто непрактично продолжать вызыватьputExtra()
все свойства, которые вы хотите передать. Например, сейчас я хочу передать объектArrayList
, содержащий объекты. Я мог бы также сделать мой ArrayListstatic
вместо этого.Объекты Android Activity могут быть уничтожены и восстановлены. Таким образом, вам нужно будет использовать другой подход, чтобы посмотреть их - или любой объект, который они создают !!! - вверх То есть вы можете передать как ссылку на статический класс, но тогда дескриптор объекта (Java вызывает эти «ссылки», как и SmallTalk; но они не являются ссылками в смысле C или сборки), возможно, будет позже недействительным, потому что «функция» Android OE - это любая Деятельность, которая может быть уничтожена и восстановлена позже.
Первоначальный вопрос был «Как передать объект из одного действия в другое в Android», и никто не ответил на это. Конечно, вы можете сериализовать (Serializable, Parcelable, в / из JSON) и передать копию данных объекта, и новый объект, имеющий те же данные, может быть создан; но он НЕ будет иметь одинаковые ссылки / дескрипторы. Также многие другие упомянули, что вы можете хранить ссылку в статическом хранилище. И это будет работать, если Android не решит удалить вашу активность.
Таким образом, чтобы действительно решить исходный вопрос, вам понадобится статический поиск, и каждый объект обновит свою ссылку, когда / если он будет создан заново. Например, каждое действие Android будет самоотверженным, если вызывается его onCreate. Вы также можете увидеть, как некоторые люди используют список задач для поиска действия по имени. (система временно уничтожает этот экземпляр действия, чтобы сэкономить место. getRunningTasks, список задач - это фактически специализированный список самого последнего экземпляра объекта каждого действия).
Для справки:
Итак, шина сообщений является работоспособным решением. Это в основном "каламбуры". Вместо того, чтобы пытаться иметь ссылки на объекты; затем вы перепроектируете свой дизайн, чтобы использовать MessagePassing вместо SequentialCode. Экспоненциально сложнее отлаживать; но это позволяет вам игнорировать такого рода понимание операционной среды. Фактически, каждый метод доступа к объекту инвертируется, поэтому вызывающая сторона публикует сообщение, а сам объект определяет обработчик для этого сообщения. Много кода, но он может быть надежным с ограничениями Android OE.
Если все, что вам нужно, это верхняя активность (типичная вещь в приложениях Android из-за повсеместного «контекста»), тогда вы можете просто указывать каждую активность как «верхнюю» в статическом глобальном пространстве всякий раз, когда вызывается его onResume. Тогда ваш AlertDialog или любой другой, которому нужен контекст, может просто взять его оттуда. Кроме того, немного неприятно использовать глобальный код, но он может упростить передачу контекста вверх и вниз повсюду, и, конечно, когда вы используете MessageBus, тогда он в любом случае глобален.
источник
Я знаю, что статика плохая, но кажется, что мы вынуждены использовать ее здесь. Проблема с parceables / seriazables заключается в том, что эти два действия имеют повторяющиеся экземпляры одного и того же объекта = потеря памяти и процессора.
Вызов деятельности
Вызываемое действие (обратите внимание, что onCreate () и onResume () могут вызываться несколько раз, когда система уничтожает и воссоздает действия)
Другой способ - объявить статическое поле класса, который вы хотите передать в этом классе. Это будет служить только для этой цели. Не забывайте, что он может быть нулевым в onCreate, потому что ваш пакет приложения был выгружен из памяти системой и перезагружен позже.
Принимая во внимание, что вам по-прежнему необходимо обрабатывать жизненный цикл активности, вы можете записывать все данные прямо в общие предпочтения, болезненные при наличии сложных структур данных.
источник
Над ответами почти все правильно , но для тех , кто не undestand ответы на эти вопросы Android имеет мощный класс Intent с помощью него вы обмена данными между не только активностью , но другой компонент Android (broadcasr приемник, услуги по содержанию обеспечения мы используем ContetnResolver класс не Intent ). В своей деятельности вы строите намерение
В вашей приемной деятельности у вас есть
Вы должны реализовать интерфейс Parceable или Serializable на вашем объекте, чтобы разделить действия. Трудно реализовать Parcealbe, а не Serializable интерфейс на объекте, поэтому Android имеет плагин специально для этого. Загрузите его и используйте его
источник
Я всегда задавался вопросом, почему это не может быть так просто, как вызов метода другой деятельности. Недавно я написал служебную библиотеку, которая делает его почти таким же простым. Вы можете проверить это здесь ( https://github.com/noxiouswinter/gnlib_android/wiki/gnlauncher ).
GNLauncher делает отправку объектов / данных в Activity из другого Activity и так же просто, как вызов функции в Activity с необходимыми данными в качестве параметров. Он вводит безопасность типов и устраняет все трудности, связанные с сериализацией, присоединением к цели с использованием строковых ключей и отменой того же на другом конце.
Применение
Определите интерфейс с методами, которые вы хотите вызвать в Activity для запуска.
Реализуйте вышеуказанный интерфейс в Activity для запуска. Также уведомите GNLauncher, когда действие будет готово.
В другой операции найдите прокси для вышеуказанной операции и вызовите любой метод с нужными параметрами.
Будет запущено первое действие и вызван метод с необходимыми параметрами.
Предпосылки
Пожалуйста, обратитесь к https://github.com/noxiouswinter/gnlib_android/wiki#prerequisites за информацией о том, как добавить зависимости.
источник
Передача объекта из одного занятия в другое.
(1) источник активности
(2) целевая активность
источник
Я использовал для установки объекта с помощью Pacelable или Serializable для передачи, но всякий раз, когда я добавляю другие переменные в объект (модель), я должен регистрировать все это. Это так неудобно.
Это очень легко перенести объект между действиями или фрагментами.
Android DataCache
источник
Мы можем передать объект из одного вида деятельности в другой вид деятельности:
Внутри
poSuppliersDetails
у нас есть некоторые ценности. Сейчас я отправляю этот объект целевой активности:Как получить это в ACtivityTwo:
источник
Передайте одно действие другому:
Получить значения:
источник
Привет всем Я вижу много хороших вариантов, но мне было интересно, почему Binding не был использован?
Создать Binder достаточно просто ...
И создание пакета для его использования не так уж и плох.
Эта логика действительно крутая, потому что вы на самом деле передаете ссылку от действия к действию.
и для реализации этого вы просто ...
Отправь это
Верни это
Черт возьми, кто-то может сойти с ума и сделать эту присоску настоящим родовым.
источник