Если вы просто передаете объекты, Parcelable был разработан для этого. Это требует немного больше усилий, чем при помощи собственной сериализации Java, но это намного быстрее (и я имею в виду способ, WAY быстрее).
Из документации простой пример того, как реализовать:
// simple class that just has one member property as an examplepublicclassMyParcelableimplementsParcelable{privateint mData;/* everything below here is for implementing Parcelable */// 99.9% of the time you can just ignore this@Overridepublicint describeContents(){return0;}// write your object's data to the passed-in Parcel@Overridepublicvoid writeToParcel(Parcelout,int flags){out.writeInt(mData);}// this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methodspublicstaticfinalParcelable.Creator<MyParcelable> CREATOR =newParcelable.Creator<MyParcelable>(){publicMyParcelable createFromParcel(Parcelin){returnnewMyParcelable(in);}publicMyParcelable[] newArray(int size){returnnewMyParcelable[size];}};// example constructor that takes a Parcel and gives you an object populated with it's valuesprivateMyParcelable(Parcelin){
mData =in.readInt();}}
Обратите внимание, что в случае, если у вас есть более одного поля для извлечения из данной Посылки, вы должны делать это в том же порядке, в котором вы их поместили (то есть в подходе FIFO).
Как только вы реализуете свои объекты, вам нужно Parcelableпросто поместить их в ваши Intents с помощью putExtra () :
Intent i =newIntent();
i.putExtra("name_of_extra", myParcelableObject);
Как это будет реализовано, если mData является объектом (например, JSONObject), а не int?
Питер Айтай
301
Почему нельзя просто передать объект без всего этого? Мы хотим передать объект, который уже находится в памяти.
Ceklock
110
@tecnotron его приложения beacuse находятся в разных процессах и имеют отдельные адресные пространства памяти, вы не можете просто отправить указатель (ссылку) на блок памяти в вашем процессе и ожидать, что он будет доступен в другом процессе.
marcinj
12
Что мне делать, если я не могу сделать класс объекта сериализуемым или Parceable?
Амель Хосе
12
@ceklock причина этого заключается в следующем: когда действие отстает, а затем уничтожается из памяти, а затем, когда пользователь открывает его из меню последних, оно должно создать действие, где оно было прервано. Это должен быть тот же пользовательский интерфейс. Объект не находится в памяти в этом случае. Но цель есть.
Tasomaniac
194
Вам нужно будет сериализовать ваш объект в какое-то строковое представление. Одним из возможных строковых представлений является JSON, и одним из самых простых способов сериализации в / из JSON в Android, если вы спросите меня, является Google GSON .
В этом случае вы просто помещаете строковое возвращаемое значение из (new Gson()).toJson(myObject);и извлекаете строковое значение и используете, fromJsonчтобы превратить его обратно в ваш объект.
Однако, если ваш объект не очень сложный, это может не стоить дополнительных затрат, и вы можете вместо этого передать отдельные значения объекта.
Я предполагаю, потому что ответ fiXedd решает ту же проблему без использования внешних библиотек, способом, который настолько настолько предпочтителен, что ни у кого никогда не должно быть причин, чтобы использовать решение, которое я предоставил (не зная, в то время, блестящее решение fiXedd)
Дэвид Хедлунд
5
Я думаю, что это правильно. Кроме того, JSON является протоколом, более подходящим для клиента / сервера, а не между потоками.
Мобибоб
16
Не обязательно плохая идея, особенно поскольку Gson намного проще в использовании, чем реализация parcelable для всех объектов, которые вы хотите отправить.
увестен
7
Как я использую GSON в моем приложении, это действительно простой и приятный способ!
Ларс
16
Хороший ответ, хотя полное решение будет String s = (new Gson().toJson(client));и тогдаCli client = new Gson().fromJson(s, Cli.class);
Хоакин Иурчук
155
Вы можете отправить сериализуемый объект через намерение
// send where details is objectClassName details =newClassName();Intent i =newIntent(context,EditActivity.class);
i.putExtra("Editing", details);
startActivity(i);//receiveClassName model =(ClassName) getIntent().getSerializableExtra("Editing");AndClassClassNameimplementsSerializable{}
что если действие уже запущено, нужно ли выполнить startActivity (i); ? Я имею в виду, могу ли я выполнить операцию A, вызывать операцию B , и это возвращает данные в операцию A ? я в замешательстве?
Франциско Корралес Моралес
3
Производительность @ Seraphim имеет значение, если вы сериализуете много объектов, но пользователь не заметит, если сериализация одного объекта займет 1 мс или 10 мс. Если преднамеренное намерение уже есть, Serializableно это не так Parcelable, это редко стоит того, чтобы сделать это Parcelable.
Кевин Крумвиде
67
Если вы знаете, что будете передавать данные в приложении, используйте «глобальные переменные» (например, статические классы).
Вот что по этому поводу сказала Дайан Хэкборн (hackbod - инженер-программист Google Android):
Если вы знаете, что действия выполняются в одном и том же процессе, вы можете просто обмениваться данными через глобальные переменные. Например, у вас может быть глобальный объект, HashMap<String, WeakReference<MyInterpreterState>>
и при создании нового MyInterpreterState придумайте для него уникальное имя и поместите его в хэш-карту; чтобы отправить это состояние в другое действие, просто поместите уникальное имя в хеш-карту, и когда второе действие будет запущено, оно может извлечь MyInterpreterState из хеш-карты с именем, которое оно получает.
да, мне показалось странным, что нам дали использовать эти намерения, а затем ведущий инженер говорит нам просто использовать глобальные переменные для наших данных. Но там это прямо изо рта лошади.
Ричард Ле Мезурье
1
Разве слабый рефренс здесь не станет жертвой сбора мусора?
uLYsseus
1
@uLYsseus думаю, что это идея, как только вы закончите с ними в действиях ... поэтому, когда соответствующие действия будут уничтожены, это позволит gc
Питер Айтай
1
@RichardLeMesurier Я думал о том же самом, но потом я посмотрел на вышеупомянутую публикацию Групп Google от Дайан Хэкборн, и она упоминает, что единственной проблемой с глобальными переменными будет действительно использование неявных намерений (которые могут запустить действие вне вашего пакета). ). Это имеет смысл, как упоминает Дайанна, потому что эти действия, скорее всего, не будут иметь представления о пользовательских типах, которые вы им передаете. Когда я это прочитал, мне стало понятнее, почему глобальные события не могут быть таким плохим маршрутом в данных обстоятельствах, и я решил, что поделюсь, если другим тоже будет любопытно
BMB
намерения были перепроектированы до такой степени, что намерение можно было передать на другой компьютер. что, очевидно, не является хорошим способом сделать что-либо, когда у вас есть только один процесс, в котором вы копаетесь. Причины, почему это не хорошо: использование памяти, использование процессора, использование батареи. последний особенно сделал выбор дизайна с намерениями, довольно озадачивающими в ретроспективе. есть люди, которые настаивают на том, что это хорошая идея, обычно потому, что "гугл сказал так".
Ласси Киннунен
49
Ваш класс должен реализовывать Serializable или Parcelable.
publicclass MY_CLASS implementsSerializable
После этого вы можете отправить объект на putExtra
Ваш класс должен реализовать Serializableнеправильно. Класс может реализовать, Parcelableнапример.
Марк Плано-Лесай,
В чем разница между Parcelable и Serializable @Kernald? с точки зрения времени обработки это медленнее / не лучшая практика или что-то?
Gumuruh
Хотя Serializableэто стандартный интерфейс Java, Parcelableявляется специфичным для Android. С точки зрения производительности, Parcelable более эффективен: developerphil.com/parcelable-vs-serializable
Марк Плано-Лесей
35
Краткий ответ для быстрой необходимости
1. Реализуйте свой класс для сериализации.
Если у вас есть внутренние классы, не забудьте также реализовать их в Serializable !!
Вы можете добиться того же, внедрив интерфейс Parcelable. Интерфейс Parcelable требует больше времени для реализации по сравнению с Serializable из-за размера кода. Но он работает быстрее, чем Serializable, и использует меньше ресурсов.
Kwnstantinos Nikoloutsos
28
если ваш объектный класс реализует Serializable, вам больше ничего не нужно делать, вы можете передать сериализуемый объект. это то, что я использую.
Предпочтительнее прямой Parcelable реализации, ИМХО. Bundle реализует Parcelable сам по себе, так что вы по-прежнему получаете выигрыш в производительности, избегая при этом всех трудностей, связанных с его реализацией самостоятельно. Вместо этого вы можете использовать пары ключ-значение для хранения и извлечения данных, которые намного надежнее, чем просто порядок.
Рисадинья
Parcelable мне кажется сложным, в своем ответе выше я использую метод toBundle из класса для своего объекта, поэтому объект преобразуется в пакет, а затем мы можем использовать конструктор для преобразования пакета в объект класса.
om252345
Это решение является жизнеспособным, только если вы передаете один объект через намерение.
TheIT
Как и JSON, но JSON - это легкий вес, я думаю.
Дэвид
Будет ли объект, когда я получу его, тем же объектом или копией?
Маркус
16
Есть несколько способов получить доступ к переменным или объектам в других классах или Activity.
А. База данных
Б. общие предпочтения.
C. Сериализация объектов.
D. Класс, который может содержать общие данные, может называться Common Utilities, это зависит от вас.
E. Передача данных через Intents и Parcelable Interface.
Это зависит от потребностей вашего проекта.
А. База данных
SQLite - это база данных с открытым исходным кодом, встроенная в Android. SQLite поддерживает стандартные функции реляционной базы данных, такие как синтаксис SQL, транзакции и подготовленные операторы.
Предположим, вы хотите сохранить имя пользователя. Таким образом, теперь будет две вещи: ключевое имя пользователя, значение- значение.
Как хранить
// Create an object of SharedPreferences.SharedPreferences sharedPref =PreferenceManager.getDefaultSharedPreferences(this);//now get EditorSharedPreferences.Editor editor = sharedPref.edit();//put your value
editor.putString("userName","stackoverlow");//commits your edits
editor.commit();
Используя putString (), putBoolean (), putInt (), putFloat (), putLong () вы можете сохранить желаемый тип данных.
Сериализация объектов используется, если мы хотим сохранить состояние объекта, чтобы отправить его по сети, или вы можете использовать его для своих целей.
Используйте бобы Java и сохраняйте их как одно из его полей и используйте для этого методы getter и setter.
JavaBeans - это классы Java, которые имеют свойства. Думайте о свойствах как о частных переменных экземпляра. Поскольку они закрыты, единственный доступ к ним за пределами их класса - через методы в классе. Методы, которые изменяют значение свойства, называются методами установки, а методы, которые извлекают значение свойства, называются методами получения.
Затем используйте сериализацию объекта для сериализации этого объекта, а в другом классе десериализуйте этот объект.
При сериализации объект может быть представлен в виде последовательности байтов, которая включает в себя данные объекта, а также информацию о типе объекта и типах данных, хранящихся в объекте.
После того, как сериализованный объект был записан в файл, его можно прочитать из файла и десериализовать, то есть информацию о типе и байты, которые представляют объект и его данные, можно использовать для воссоздания объекта в памяти.
Если вы хотите учебник для этого, чтобы ссылаться на эту ссылку
хороший ответ, но увеличьте свои стандарты кодирования ... +1, хотя для привлечения Serializable в конкурсе, однако, посылки намного быстрее ...
Amit
13
Я использую Gson с его настолько мощным и простым API для отправки объектов между действиями,
пример
// This is the object to be sent, can be any objectpublicclassAndroidPacket{publicStringCustomerName;//constructorpublicAndroidPacket(String cName){CustomerName= cName;}// other fields ....// You can add those functions as LiveTemplate !publicString toJson(){Gson gson =newGson();return gson.toJson(this);}publicstaticAndroidPacket fromJson(String json){Gson gson =newGson();return gson.fromJson(json,AndroidPacket.class);}}
2 функции вы добавляете их к объектам, которые вы хотите отправить
Применение
Отправить объект от А до Б
// Convert the object to string using GsonAndroidPacket androidPacket =newAndroidPacket("Ahmad");String objAsJson = androidPacket.toJson();Intent intent =newIntent(A.this, B.class);
intent.putExtra("my_obj", objAsJson);
startActivity(intent);
Получить в б
@Overrideprotectedvoid onCreate(Bundle savedInstanceState){Bundle bundle = getIntent().getExtras();String objAsJson = bundle.getString("my_obj");AndroidPacket androidPacket =AndroidPacket.fromJson(objAsJson);// Here you can use your ObjectLog.d("Gson", androidPacket.CustomerName);}
Я использую его почти в каждом проекте, и у меня нет проблем с производительностью.
Я боролся с той же проблемой. Я решил это с помощью статического класса, храня любые данные, которые я хочу в HashMap. Сверху я использую расширение стандартного класса Activity, в котором я переопределил методы onCreate и onDestroy, чтобы скрыть транспортировку и очистку данных. Некоторые нелепые настройки должны быть изменены, например, ориентация.
Аннотация: Отсутствие общих объектов для передачи другому. Деятельность - это боль в заднице. Это все равно что выстрелить себе в колено и надеяться выиграть 100 метров. «Parcable» не является достаточной заменой. Это заставляет меня смеяться ... Я не хочу внедрять этот интерфейс в мой API без технологий, так как меньше я хочу представить новый уровень ... Как могло случиться, что мы находимся в мобильном программировании так далеко от современная парадигма ...
Это удобно, если у вас есть объекты с областью действия на уровне приложения, т.е. они должны использоваться во всем приложении. ParcelableМетод еще лучше , если вы хотите , явный контроль над областью объекта или если область ограничена.
Это позволяет избежать использования в Intentsцелом, однако. Я не знаю, подходят ли они вам. Другой способ, которым я воспользовался, - это чтобы intидентификаторы объектов отправлялись через намерения и извлекали объекты, которые есть у меня в Картах в Applicationобъекте.
Это неправильный способ, так как объекты могут быть переменными, ваш может работать, если вы говорите о статических объектах на протяжении жизненного цикла приложения, но иногда нам нужны пассивные объекты, которые могут быть сгенерированы с помощью веб-сервиса или так и stackoverflow.com / a / 2736612/716865
Муханнад А.Алхарири,
Я успешно использовал его с объектами, сгенерированными из веб-сервисов, имея область приложения, Mapгде объекты хранятся и извлекаются с использованием идентификатора. Единственная реальная проблема с этим подходом состоит в том, что Android через некоторое время очищает память, поэтому вы должны проверить наличие нулей в вашем onResume (я думаю, что объекты, переданные в намерениях, сохраняются, но я не уверен). Кроме того, я не считаю это значительно хуже.
Саад Фарук
Это лучший ответ. Он показывает, как разные действия могут ссылаться на одну и ту же модель данных. Мне понадобилось много времени, чтобы открыть это!
Маркус
6
в вашей модели класса (Object) реализовать Serializable, например:
или создать сериализуемый класс для передачи другому действию того, что вы хотите передать.
UMAR
9
Просто помните, чтобы не ставить большие толстые предметы. Время жизни этого объекта будет таким же, как и время жизни приложения. И никогда не храните представления. Этот метод также гарантирует утечки памяти.
Рено
1
Этот ответ полезен, но не является лучшим решением с точки зрения оптимизации памяти и ресурсов
Атул Бхардвай
1
Это нарушает принципы ООП, вводя глобальные переменные. Вы никогда не знаете, в каком они состоянии, установлены они или нет, они используются многими потоками, и вам приходится иметь дело с этой сложностью. Обычно это хорошая утечка памяти, потому что вы даже не знаете, когда освобождать эти переменные. Нельзя сказать, что он вводит жесткую прямую связь между различными модулями приложения.
апреля
2
WTF? Два других ответа намного лучше.
IcyFlame
4
вы можете использовать методы putExtra (Serializable ..) и getSerializableExtra () для передачи и извлечения объектов типа вашего класса; вам нужно пометить ваш класс Serializable и убедиться, что все ваши переменные-члены тоже сериализуемы ...
Введите имя проекта: android-pass-object-to-activity
Pakcage: com.hmkcode.android
Оставьте другие значения по умолчанию, переходите к следующему, пока не дойдете до конца
Перед началом создания приложения нам нужно создать класс POJO «Person», который мы будем использовать для отправки объекта из одного действия в другое. Обратите внимание, что класс реализует интерфейс Serializable.
Person.java
package com.hmkcode.android;import java.io.Serializable;publicclassPersonimplementsSerializable{privatestaticfinallong serialVersionUID =1L;privateString name;privateint age;// getters & setters....@OverridepublicString toString(){return"Person [name="+ name +", age="+ age +"]";}}
Два макета для двух занятий
activity_main.xml
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/tvName"android:layout_width="100dp"android:layout_height="wrap_content"android:layout_gravity="center"android:gravity="center_horizontal"android:text="Name"/><EditTextandroid:id="@+id/etName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:ems="10"><requestFocus/></EditText></LinearLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/tvAge"android:layout_width="100dp"android:layout_height="wrap_content"android:layout_gravity="center"android:gravity="center_horizontal"android:text="Age"/><EditTextandroid:id="@+id/etAge"android:layout_width="wrap_content"android:layout_height="wrap_content"android:ems="10"/></LinearLayout><Buttonandroid:id="@+id/btnPassObject"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="Pass Object to Another Activity"/></LinearLayout>
package com.hmkcode.android;import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;publicclassMainActivityextendsActivityimplementsOnClickListener{Button btnPassObject;EditText etName, etAge;@Overrideprotectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnPassObject =(Button) findViewById(R.id.btnPassObject);
etName =(EditText) findViewById(R.id.etName);
etAge =(EditText) findViewById(R.id.etAge);
btnPassObject.setOnClickListener(this);}@Overridepublicvoid onClick(View view){// 1. create an intent pass class name or intnet action name Intent intent =newIntent("com.hmkcode.android.ANOTHER_ACTIVITY");// 2. create person objectPerson person =newPerson();
person.setName(etName.getText().toString());
person.setAge(Integer.parseInt(etAge.getText().toString()));// 3. put person in intent data
intent.putExtra("person", person);// 4. start the activity
startActivity(intent);}}
2) AnotherActivity.java
package com.hmkcode.android;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.widget.TextView;publicclassAnotherActivityextendsActivity{TextView tvPerson;@Overrideprotectedvoid onCreate(Bundle savedInstanceState){// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);
setContentView(R.layout.activity_another);// 1. get passed intent Intent intent = getIntent();// 2. get person object from intentPerson person =(Person) intent.getSerializableExtra("person");// 3. get reference to person textView
tvPerson =(TextView) findViewById(R.id.tvPerson);// 4. display name & age on textView
tvPerson.setText(person.toString());}}
Используя библиотеку Google Gson, вы можете передать объект другим действиям. Фактически мы преобразуем объект в виде строки json, а после перехода к другому действию мы снова преобразуем объект таким образом.
Example exampleObject=newExample(1,"hello");String jsonString =newGson().toJson(exampleObject);Intent nextIntent=newIntent(this,NextActivity.class);
nextIntent.putExtra("example",jsonString );
startActivity(nextIntent);
Для чтения нам нужно сделать обратную операцию в NextActivity
Example defObject=newExample(-1,null);//default value to return when example is not availableString defValue=newGson().toJson(defObject);String jsonString=getIntent().getExtras().getString("example",defValue);//passed example objectExample exampleObject=newGson().fromJson(jsonString,Example.class);
Если у вас есть одноэлементный класс (fx Service), который в любом случае выступает в качестве шлюза к уровню вашей модели, его можно решить, если для него есть переменная в этом классе с методами получения и установки.
privateService service;privateOrder order;@Overrideprotectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quality);
service =Service.getInstance();
order = service.getSavedOrder();
service.setSavedOrder(null)//If you don't want to save it for the entire session of the app.}
Это решение не требует какой-либо сериализации или другой «упаковки» рассматриваемого объекта. Но это будет выгодно только в том случае, если вы все равно используете такую архитектуру.
Каковы недостатки этого подхода? Это кажется таким логичным и стройным. Я всегда читаю, что вы не должны этого делать, но я никогда не получаю хорошего объяснения того, что может пойти не так.
Маркус
Поскольку я больше не могу редактировать свой комментарий: разве это не единственное возможное решение получить ссылку на объект вместо копии? Мне нужно получить тот же объект, а не копию!
Маркус
Я думаю, что это несколько обескураживает из-за высокой связи, к которой это приводит. Но да, насколько я вижу, этот подход наиболее эффективен, если вам нужен реальный объект. Как всегда в программировании, вы можете делать все, что захотите, вы просто хотите делать это осторожно. Это решение сработало для меня, и я предпочитаю его, так как я все равно использую эту архитектуру.
Kitalda
На самом деле я закончил расширением класса Application и сохранил там свою модель данных. В Intents я только передавал идентификатор объектов данных, которые можно использовать для извлечения исходного объекта из класса Application. Кроме того, расширенный класс приложения уведомляет все объекты, использующие модель данных, если она изменяется с помощью стандартной концепции прослушивателя. Я знаю, что это подходит только для моего случая, когда мне нужно поделиться моделью данных по всему приложению, но для этого случая он идеален и не требует статических классов и полей!
Маркус
2
Безусловно самый простой способ ИМХО для посылки объектов. Вы просто добавляете тег аннотации над объектом, который хотите сделать пригодным для продажи.
Ответы:
Если вы просто передаете объекты, Parcelable был разработан для этого. Это требует немного больше усилий, чем при помощи собственной сериализации Java, но это намного быстрее (и я имею в виду способ, WAY быстрее).
Из документации простой пример того, как реализовать:
Обратите внимание, что в случае, если у вас есть более одного поля для извлечения из данной Посылки, вы должны делать это в том же порядке, в котором вы их поместили (то есть в подходе FIFO).
Как только вы реализуете свои объекты, вам нужно
Parcelable
просто поместить их в ваши Intents с помощью putExtra () :Затем вы можете вытащить их обратно с помощью getParcelableExtra () :
Если ваш класс объектов реализует Parcelable и Serializable, убедитесь, что вы выполняете приведение к одному из следующих:
источник
Вам нужно будет сериализовать ваш объект в какое-то строковое представление. Одним из возможных строковых представлений является JSON, и одним из самых простых способов сериализации в / из JSON в Android, если вы спросите меня, является Google GSON .
В этом случае вы просто помещаете строковое возвращаемое значение из
(new Gson()).toJson(myObject);
и извлекаете строковое значение и используете,fromJson
чтобы превратить его обратно в ваш объект.Однако, если ваш объект не очень сложный, это может не стоить дополнительных затрат, и вы можете вместо этого передать отдельные значения объекта.
источник
String s = (new Gson().toJson(client));
и тогдаCli client = new Gson().fromJson(s, Cli.class);
Вы можете отправить сериализуемый объект через намерение
источник
Serializable
но это не такParcelable
, это редко стоит того, чтобы сделать этоParcelable
.Если вы знаете, что будете передавать данные в приложении, используйте «глобальные переменные» (например, статические классы).
Вот что по этому поводу сказала Дайан Хэкборн (hackbod - инженер-программист Google Android):
источник
Ваш класс должен реализовывать Serializable или Parcelable.
После этого вы можете отправить объект на putExtra
Чтобы получить дополнительные услуги, вам нужно только сделать
Если ваш класс реализует Parcelable, используйте следующее
Надеюсь, это поможет: D
источник
Serializable
неправильно. Класс может реализовать,Parcelable
например.Serializable
это стандартный интерфейс Java,Parcelable
является специфичным для Android. С точки зрения производительности, Parcelable более эффективен: developerphil.com/parcelable-vs-serializableКраткий ответ для быстрой необходимости
1. Реализуйте свой класс для сериализации.
Если у вас есть внутренние классы, не забудьте также реализовать их в Serializable !!
2. Поместите свой объект в намерение
3. И получите свой объект в другом классе деятельности
источник
если ваш объектный класс реализует
Serializable
, вам больше ничего не нужно делать, вы можете передать сериализуемый объект.это то, что я использую.
источник
реализовать сериализуемый в вашем классе
Тогда вы можете передать этот объект в намерение
во втором упражнении вы можете получить такие данные
Но когда данные станут большими, этот метод будет медленным.
источник
Вы можете использовать Android BUNDLE, чтобы сделать это.
Создайте комплект из вашего класса, например:
Затем передайте этот комплект с INTENT. Теперь вы можете воссоздать ваш объект класса, передав
Объявите это в своем пользовательском классе и используйте.
источник
Есть несколько способов получить доступ к переменным или объектам в других классах или Activity.
А. База данных
Б. общие предпочтения.
C. Сериализация объектов.
D. Класс, который может содержать общие данные, может называться Common Utilities, это зависит от вас.
E. Передача данных через Intents и Parcelable Interface.
Это зависит от потребностей вашего проекта.
А. База данных
SQLite - это база данных с открытым исходным кодом, встроенная в Android. SQLite поддерживает стандартные функции реляционной базы данных, такие как синтаксис SQL, транзакции и подготовленные операторы.
Учебники - http://www.vogella.com/articles/AndroidSQLite/article.html
Б. Общие предпочтения
Предположим, вы хотите сохранить имя пользователя. Таким образом, теперь будет две вещи: ключевое имя пользователя, значение- значение.
Как хранить
Используя putString (), putBoolean (), putInt (), putFloat (), putLong () вы можете сохранить желаемый тип данных.
Как получить
http://developer.android.com/reference/android/content/SharedPreferences.html
C. Сериализация объектов
Сериализация объектов используется, если мы хотим сохранить состояние объекта, чтобы отправить его по сети, или вы можете использовать его для своих целей.
Используйте бобы Java и сохраняйте их как одно из его полей и используйте для этого методы getter и setter.
JavaBeans - это классы Java, которые имеют свойства. Думайте о свойствах как о частных переменных экземпляра. Поскольку они закрыты, единственный доступ к ним за пределами их класса - через методы в классе. Методы, которые изменяют значение свойства, называются методами установки, а методы, которые извлекают значение свойства, называются методами получения.
Установите переменную в вашем почтовом методе, используя
Затем используйте сериализацию объекта для сериализации этого объекта, а в другом классе десериализуйте этот объект.
При сериализации объект может быть представлен в виде последовательности байтов, которая включает в себя данные объекта, а также информацию о типе объекта и типах данных, хранящихся в объекте.
После того, как сериализованный объект был записан в файл, его можно прочитать из файла и десериализовать, то есть информацию о типе и байты, которые представляют объект и его данные, можно использовать для воссоздания объекта в памяти.
Если вы хотите учебник для этого, чтобы ссылаться на эту ссылку
http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html
Получить переменную в других классах
D. Общие коммунальные услуги
Вы можете создать класс самостоятельно, который может содержать общие данные, которые вам часто нужны в вашем проекте.
Образец
E. Передача данных через намерения
Пожалуйста, обратитесь к этому руководству для этой опции передачи данных.
http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/
источник
Спасибо за посылочную помощь, но я нашел еще одно дополнительное решение
В первом упражнении
Получить данные в упражнении 2
источник
Я использую Gson с его настолько мощным и простым API для отправки объектов между действиями,
пример
2 функции вы добавляете их к объектам, которые вы хотите отправить
Применение
Отправить объект от А до Б
Получить в б
Я использую его почти в каждом проекте, и у меня нет проблем с производительностью.
источник
Я боролся с той же проблемой. Я решил это с помощью статического класса, храня любые данные, которые я хочу в HashMap. Сверху я использую расширение стандартного класса Activity, в котором я переопределил методы onCreate и onDestroy, чтобы скрыть транспортировку и очистку данных. Некоторые нелепые настройки должны быть изменены, например, ориентация.
Аннотация: Отсутствие общих объектов для передачи другому. Деятельность - это боль в заднице. Это все равно что выстрелить себе в колено и надеяться выиграть 100 метров. «Parcable» не является достаточной заменой. Это заставляет меня смеяться ... Я не хочу внедрять этот интерфейс в мой API без технологий, так как меньше я хочу представить новый уровень ... Как могло случиться, что мы находимся в мобильном программировании так далеко от современная парадигма ...
источник
В вашей первой деятельности:
И в твоем втором:
Не забудьте сделать свой пользовательский объект Сериализуемым:
источник
Еще один способ сделать это - использовать
Application
объект (android.app.Application). Вы определяете это в вашемAndroidManifest.xml
файле как:Затем вы можете вызвать это из любого действия и сохранить объект в
Application
классе.В FirstActivity:
В SecondActivity выполните:
Это удобно, если у вас есть объекты с областью действия на уровне приложения, т.е. они должны использоваться во всем приложении.
Parcelable
Метод еще лучше , если вы хотите , явный контроль над областью объекта или если область ограничена.Это позволяет избежать использования в
Intents
целом, однако. Я не знаю, подходят ли они вам. Другой способ, которым я воспользовался, - это чтобыint
идентификаторы объектов отправлялись через намерения и извлекали объекты, которые есть у меня в Картах вApplication
объекте.источник
Map
где объекты хранятся и извлекаются с использованием идентификатора. Единственная реальная проблема с этим подходом состоит в том, что Android через некоторое время очищает память, поэтому вы должны проверить наличие нулей в вашем onResume (я думаю, что объекты, переданные в намерениях, сохраняются, но я не уверен). Кроме того, я не считаю это значительно хуже.в вашей модели класса (Object) реализовать Serializable, например:
и ваша первая активность
и ваша вторая активность (NewActivity)
удачи!!
источник
Передача данных:
Извлечение данных:
источник
самое простое решение, которое я нашел, - это создать класс со статическими членами-данными с установщиками-получателями.
установить из одного действия и получить из другого действия этот объект.
деятельность А
деятельность б
источник
вы можете использовать методы putExtra (Serializable ..) и getSerializableExtra () для передачи и извлечения объектов типа вашего класса; вам нужно пометить ваш класс Serializable и убедиться, что все ваши переменные-члены тоже сериализуемы ...
источник
Создать приложение для Android
Файл >> Новый >> Приложение для Android
Введите имя проекта: android-pass-object-to-activity
Pakcage: com.hmkcode.android
Оставьте другие значения по умолчанию, переходите к следующему, пока не дойдете до конца
Перед началом создания приложения нам нужно создать класс POJO «Person», который мы будем использовать для отправки объекта из одного действия в другое. Обратите внимание, что класс реализует интерфейс Serializable.
Person.java
Два макета для двух занятий
activity_main.xml
activity_another.xml
Два занятия
1) ActivityMain.java
2) AnotherActivity.java
источник
Используя библиотеку Google Gson, вы можете передать объект другим действиям. Фактически мы преобразуем объект в виде строки json, а после перехода к другому действию мы снова преобразуем объект таким образом.
Рассмотрим класс бобов, подобный этому
Нам нужно передать объект класса Example
Для чтения нам нужно сделать обратную операцию в NextActivity
Добавьте эту зависимость в Gradle
источник
источник
Я знаю, что уже поздно, но это очень просто. Все, что вам нужно сделать, это позволить вашему классу реализовать Serializable, как
тогда вы можете перейти к намерению, как
Чтобы получить его, просто позвоните
источник
Если у вас есть одноэлементный класс (fx Service), который в любом случае выступает в качестве шлюза к уровню вашей модели, его можно решить, если для него есть переменная в этом классе с методами получения и установки.
В упражнении 1:
В упражнении 2:
В сервисе:
Это решение не требует какой-либо сериализации или другой «упаковки» рассматриваемого объекта. Но это будет выгодно только в том случае, если вы все равно используете такую архитектуру.
источник
Безусловно самый простой способ ИМХО для посылки объектов. Вы просто добавляете тег аннотации над объектом, который хотите сделать пригодным для продажи.
Пример из библиотеки ниже https://github.com/johncarl81/parceler
источник
Сначала реализуйте Parcelable в своем классе. Затем передайте объект, как это.
SendActivity.java
ReceiveActivity.java
Строка пакета не обязательна, просто строка должна быть одинаковой в обеих операциях
ССЫЛКА
источник
Запустите другое действие с помощью параметров передачи этого действия через Bundle Object
Получить другой вид деятельности (YourActivity)
Это нормально для простого типа данных. Но если вы хотите передать сложные данные между действиями, вам нужно сначала сериализовать их.
Здесь у нас есть модель сотрудника
Вы можете использовать Gson lib, предоставленный Google, для сериализации сложных данных, подобных этой
источник
В Колтин
Добавьте расширение kotlin в ваш build.gradle.
Затем создайте свой класс данных следующим образом.
Передать объект с намерением
Получить объект с намерением
источник
Самый простой и Java-способ сделать это: реализовать сериализуемость в вашем классе pojo / model
Рекомендуется для Android для просмотра производительности: сделать модель пригодной для продажи
источник
Простейшим было бы просто использовать следующее, где элемент является строкой:
Для получения:
источник