Wenn Sie nur Objekte herumreichen, wurde Parcelable dafür entwickelt. Es erfordert ein wenig mehr Aufwand , um den Einsatz als Java native Serialisierung verwenden, aber es ist viel schneller (und ich meine Art und Weise, WAY schneller).
Ein einfaches Beispiel für die Implementierung aus den Dokumenten ist:
// 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();}}
Beachten Sie, dass Sie in dem Fall, in dem Sie mehr als ein Feld von einem bestimmten Paket abrufen müssen, dies in derselben Reihenfolge tun müssen, in der Sie es eingegeben haben (dh bei einem FIFO-Ansatz).
Sobald Sie Ihre Objekte implementieren Parcelablees ist nur eine Frage von ihnen in Putten Intents mit putExtra () :
Intent i =newIntent();
i.putExtra("name_of_extra", myParcelableObject);
Wie würde dies implementiert, wenn mData ein Objekt (z. B. JSONObject) und kein int ist?
Peter Ajtai
301
Warum kann man das Objekt nicht einfach ohne all das passieren? Wir wollen ein Objekt übergeben, das sich bereits im Speicher befindet.
ceklock
110
@tecnotron seine Beacuse-Apps befinden sich in verschiedenen Prozessen und haben separate Speicheradressräume. Sie können nicht einfach einen Zeiger (eine Referenz) auf den Speicherblock in Ihrem Prozess senden und erwarten, dass dieser in einem anderen Prozess verfügbar ist.
März
12
Was mache ich, wenn ich die Klasse des Objekts nicht serialisierbar oder parceable machen kann?
Amel Jose
11
@ceklock Der Grund dafür ist folgender: Wenn die Aktivität zurückbleibt und später aus dem Speicher beendet wird und der Benutzer sie dann über das Menü "Letzte" öffnet, muss er die Aktivität dort erstellen, wo sie aufgehört hat. Es muss dieselbe Benutzeroberfläche sein. Das Objekt befindet sich in diesem Fall nicht im Speicher. Aber die Absicht ist.
Tasomaniac
194
Sie müssen Ihr Objekt in eine Art Zeichenfolgendarstellung serialisieren. Eine mögliche Zeichenfolgendarstellung ist JSON, und eine der einfachsten Möglichkeiten, um von / nach JSON in Android zu serialisieren, ist, wenn Sie mich fragen, Google GSON .
In diesem Fall geben Sie einfach den Zeichenfolgenrückgabewert von ein, (new Gson()).toJson(myObject);rufen den Zeichenfolgenwert ab und verwenden ihn fromJson, um ihn wieder in Ihr Objekt umzuwandeln.
Wenn Ihr Objekt jedoch nicht sehr komplex ist, ist es möglicherweise den Aufwand nicht wert, und Sie können stattdessen die separaten Werte des Objekts übergeben.
Ich vermute, weil die Antwort von fiXedd das gleiche Problem ohne die Verwendung externer Bibliotheken auf eine Weise löst, die einfach so vorzuziehen ist, dass niemand jemals einen Grund haben sollte, sich für die von mir bereitgestellte Lösung zu entscheiden (ohne es zu wissen) fiXedds brillante Lösung)
David Hedlund
5
Ich denke das ist richtig. Darüber hinaus ist JSON ein Protokoll, das eher für Client / Server und nicht für Thread-to-Thread geeignet ist.
Mobibob
16
Nicht unbedingt eine schlechte Idee, insb. da Gson viel einfacher zu verwenden ist, als Parcelable für alle Objekte zu implementieren, die Sie senden möchten.
Uvesten
7
Da ich Gson in meiner App verwende, ist dies ein sehr einfacher und netter Weg!
Lars
16
Schöne Antwort, obwohl vollständige Lösung wäre String s = (new Gson().toJson(client));und dannCli client = new Gson().fromJson(s, Cli.class);
Joaquin Iurchuk
155
Sie können serialisierbare Objekte absichtlich senden
// 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{}
Was ist, wenn die Aktivität bereits ausgeführt wird? Muss startActivity (i) ausgeführt werden? ? Ich meine, kann ich Aktivität A dazu bringen , Aktivität B aufzurufen , und das gibt Daten an Aktivität A zurück ? bin ich verwirrt
Francisco Corrales Morales
3
Die Leistung von @ Seraphim ist wichtig, wenn Sie viele Objekte serialisieren. Der Benutzer merkt jedoch nicht, ob die Serialisierung eines Objekts 1 ms oder 10 ms dauert. Wenn ein Vorsatz-Extra bereits vorhanden ist, Serializableaber nicht Parcelable, lohnt es sich selten, es zu machen Parcelable.
Kevin Krumwiede
67
Verwenden Sie in Situationen, in denen Sie wissen, dass Sie Daten innerhalb einer Anwendung übergeben, "Globals" (wie statische Klassen).
Hier ist, was Dianne Hackborn (hackbod - ein Google Android Software Engineer) zu diesem Thema zu sagen hatte:
In Situationen, in denen Sie wissen, dass die Aktivitäten im selben Prozess ausgeführt werden, können Sie Daten einfach über globale Elemente freigeben. Sie könnten beispielsweise einen globalen Namen haben HashMap<String, WeakReference<MyInterpreterState>>
und beim Erstellen eines neuen MyInterpreterState einen eindeutigen Namen dafür erstellen und in die Hash-Map einfügen. Um diesen Status an eine andere Aktivität zu senden, geben Sie einfach den eindeutigen Namen in die Hash-Map ein. Wenn die zweite Aktivität gestartet wird, kann der MyInterpreterState mit dem Namen, den er empfängt, aus der Hash-Map abgerufen werden.
Ja, ich fand es seltsam, dass wir diese Absichten erhalten, und dann sagt uns ein Top-Ingenieur, wir sollen nur Globale für unsere Daten verwenden. Aber da ist es direkt aus dem Maul des Pferdes.
Richard Le Mesurier
1
Wäre eine schwache Auffrischung hier nicht ein Opfer der Müllabfuhr?
ULYsseus
1
@uLYsseus denke, das ist die Idee, wenn Sie mit ihnen in den Aktivitäten fertig sind ... Wenn die relevanten Aktivitäten zerstört sind, wird es gc ermöglichen
Peter Ajtai
1
@RichardLeMesurier Ich habe das Gleiche gedacht, aber dann habe ich mir den oben genannten Beitrag von Google Groups von Dianne Hackborn angesehen und sie erwähnt, dass das einzige Problem mit Globals die Verwendung impliziter Absichten ist (die eine Aktivität außerhalb Ihres Pakets starten können ). Dies ist sinnvoll, wie Dianne erwähnt, da diese Aktivitäten höchstwahrscheinlich keine Kenntnis von den benutzerdefinierten Typen haben, die Sie an sie übergeben. Nachdem ich das gelesen hatte, wurde mir klarer, warum Globals unter den gegebenen Umständen keine so schlechte Route sein könnten, und ich dachte, ich würde sie teilen, falls andere auch neugierig wären
BMB
Die Absichten wurden bis zu einem Punkt überarbeitet, an dem die Absichten an einen anderen Computer weitergegeben werden konnten. Dies ist offensichtlich kein guter Weg, um etwas zu tun, wenn Sie tatsächlich nur einen Prozess haben, an dem Sie herumspielen. Gründe, warum es nicht gut ist: Speichernutzung, CPU-Nutzung, Batterieverbrauch. Der letzte traf besonders die Designentscheidungen mit Absichten, die im Nachhinein ziemlich verwirrend waren. Es gibt Leute, die darauf bestehen, dass sie eine gute Idee sind, normalerweise, weil "Google das gesagt hat".
Lassi Kinnunen
49
Ihre Klasse sollte Serializable oder Parcelable implementieren.
publicclass MY_CLASS implementsSerializable
Sobald Sie fertig sind, können Sie ein Objekt auf putExtra senden
Ihre Klasse muss implementieren Serializableist falsch. Die Klasse kann Parcelablezum Beispiel implementieren .
Marc Plano-Lesay
Was ist der Unterschied zwischen Parcelable und Serializable @Kernald? In Bezug auf die Verarbeitungszeit ist es langsamer / nicht Best Practice oder so?
Gumuruh
Während Serializablees sich um eine Standard-Java-Oberfläche handelt, Parcelableist es Android-spezifisch. In Bezug auf die Leistung ist Parcelable effizienter: developerphil.com/parcelable-vs-serializable
Marc Plano-Lesay
35
Kurze Antwort für schnelle Bedürfnisse
1. Implementieren Sie Ihre Klasse in Serializable.
Wenn Sie innere Klassen haben, vergessen Sie nicht, diese auch in Serializable zu implementieren !!
Sie können dasselbe erreichen, indem Sie die Parcelable-Schnittstelle implementieren. Die Implementierung der Paketschnittstelle dauert im Vergleich zu Serializable aufgrund der Codegröße länger. Es ist jedoch schneller als serialisierbar und verbraucht weniger Ressourcen.
Kwnstantinos Nikoloutsos
27
Wenn Ihre Objektklasse implementiert ist Serializable, müssen Sie nichts weiter tun. Sie können ein serialisierbares Objekt übergeben. das ist was ich benutze.
IMHO der direkten Implementierung von Parcelable vorzuziehen. Bundle implementiert Parcelable selbst, sodass Sie immer noch den Leistungsgewinn erzielen und gleichzeitig die Probleme vermeiden, es selbst zu implementieren. Stattdessen können Sie Schlüssel-Wert-Paare verwenden, um Daten zu speichern und abzurufen, die bei weitem robuster sind, als wenn Sie sich nur auf die Reihenfolge verlassen.
Risadinha
Parcelable scheint mir kompliziert zu sein. In meiner obigen Antwort verwende ich die toBundle-Methode aus der Klasse für das Objekt, sodass das Objekt in ein Bundle konvertiert wird. Anschließend können wir den Konstruktor verwenden, um das Bundle in ein Klassenobjekt zu konvertieren.
Om252345
Diese Lösung ist nur möglich, wenn Sie ein einzelnes Objekt durch eine Absicht führen.
TheIT
Wie Json, aber Json ist leicht, denke ich.
David
Wird das Objekt beim Abrufen dasselbe Objekt oder eine Kopie sein?
Markus
16
Es gibt verschiedene Möglichkeiten, auf Variablen oder Objekte in anderen Klassen oder Aktivitäten zuzugreifen.
Eine Datenbank
B. gemeinsame Einstellungen.
C. Objektserialisierung.
D. Eine Klasse, die allgemeine Daten enthalten kann, kann als Common Utilities bezeichnet werden, abhängig von Ihnen.
E. Weitergabe von Daten über Absichten und Paketschnittstelle.
Dies hängt von Ihren Projektanforderungen ab.
A. Datenbank
SQLite ist eine Open Source-Datenbank, die in Android eingebettet ist. SQLite unterstützt standardmäßige relationale Datenbankfunktionen wie SQL-Syntax, Transaktionen und vorbereitete Anweisungen.
Angenommen, Sie möchten den Benutzernamen speichern. Es gibt also jetzt zwei Dinge: einen Schlüsselbenutzernamen , Wert Wert.
Wie zu speichern
// 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();
Mit putString (), putBoolean (), putInt (), putFloat (), putLong () können Sie Ihren gewünschten Datentyp speichern.
Die Objektserialisierung wird verwendet, wenn ein Objektstatus gespeichert werden soll, um ihn über das Netzwerk zu senden, oder wenn Sie ihn auch für Ihren Zweck verwenden können.
Verwenden Sie Java-Bohnen und speichern Sie sie als eines seiner Felder. Verwenden Sie dafür Getter und Setter
JavaBeans sind Java-Klassen mit Eigenschaften. Stellen Sie sich Eigenschaften als private Instanzvariablen vor. Da sie privat sind, können sie nur über Methoden in der Klasse von außerhalb ihrer Klasse aufgerufen werden. Die Methoden, die den Wert einer Eigenschaft ändern, werden als Setter-Methoden bezeichnet, und die Methoden, die den Wert einer Eigenschaft abrufen, werden als Getter-Methoden bezeichnet.
Verwenden Sie dann das Objekt Serialzation, um dieses Objekt zu serialisieren, und deserialisieren Sie dieses Objekt in Ihrer anderen Klasse.
Bei der Serialisierung kann ein Objekt als eine Folge von Bytes dargestellt werden, die die Daten des Objekts sowie Informationen über den Objekttyp und die im Objekt gespeicherten Datentypen enthält.
Nachdem ein serialisiertes Objekt in eine Datei geschrieben wurde, kann es aus der Datei gelesen und deserialisiert werden, dh die Typinformationen und Bytes, die das Objekt und seine Daten darstellen, können verwendet werden, um das Objekt im Speicher neu zu erstellen.
Wenn Sie ein Tutorial dazu wünschen, verweisen Sie auf diesen Link
Gute Antwort, aber erhöhen Sie Ihre Codierungsstandards ... +1, um Serializable in die Konkurrenz zu bringen, aber Parcellables sind viel schneller ...
Amit
13
Ich benutze Gson mit seiner so mächtigen und einfachen API, um Objekte zwischen Aktivitäten zu senden.
Beispiel
// 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);}}
Mit 2 Funktionen fügen Sie sie den Objekten hinzu, die Sie senden möchten
Verwendungszweck
Objekt von A nach B senden
// 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);
In B empfangen
@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);}
Ich benutze es fast in jedem Projekt, das ich mache, und ich habe keine Leistungsprobleme.
Danke, das hat mir Stunden der Überkomplikation erspart.
Hristo Stoyanov
10
Ich hatte mit dem gleichen Problem zu kämpfen. Ich habe es mithilfe einer statischen Klasse gelöst und alle gewünschten Daten in einer HashMap gespeichert. Darüber hinaus verwende ich eine Erweiterung der Standard-Aktivitätsklasse, in der ich die Methoden onCreate an onDestroy überschrieben habe, um den Datentransport und die Datenlöschung versteckt durchzuführen. Einige lächerliche Einstellungen müssen geändert werden, z. B. Orientierungshandhabung.
Anmerkung: Das Nicht-Bereitstellen allgemeiner Objekte, die an eine andere Aktivität weitergegeben werden sollen, ist ein Schmerz im Arsch. Es ist, als würde man sich ins Knie schießen und hoffen, 100 Meter zu gewinnen. "Parcable" ist kein ausreichender Ersatz. Es bringt mich zum Lachen ... Ich möchte diese Schnittstelle nicht in meine technologiefreie API implementieren, da ich weniger eine neue Ebene einführen möchte ... Wie könnte es sein, dass wir in der mobilen Programmierung so weit weg sind modernes Paradigma ...
Paket ist besser als serialisierbar! Vermeiden Sie es, Serializable in Ihrem Android-Code zu verwenden!
Filipe Brito
7
Eine andere Möglichkeit, dies zu tun, besteht darin, das ApplicationObjekt (android.app.Application) zu verwenden. Sie definieren dies in Ihrer AndroidManifest.xmlDatei als:
<application
android:name=".MyApplication"
...
Sie können dies dann von jeder Aktivität aus aufrufen und das Objekt in der ApplicationKlasse speichern .
Dies ist praktisch, wenn Sie Objekte mit Anwendungsbereich haben, dh sie müssen in der gesamten Anwendung verwendet werden. Die ParcelableMethode ist immer noch besser, wenn Sie eine explizite Kontrolle über den Objektbereich wünschen oder wenn der Bereich begrenzt ist.
Dies vermeidet jedoch die Verwendung von Intentsinsgesamt. Ich weiß nicht, ob sie zu dir passen. Eine andere Möglichkeit, die ich verwendet habe, besteht darin, intBezeichner von Objekten durch Absichten senden zu lassen und Objekte abzurufen, die ich in Maps im ApplicationObjekt habe.
Es ist nicht der richtige Weg, Dinge zu tun, da die Objekte variabel sein können. Ihre können funktionieren, wenn Sie über statische Objekte während des Lebenszyklus der App sprechen. Manchmal müssen wir jedoch Objekte übergeben, die möglicherweise über den Webservice oder so über stackoverflow.com generiert wurden / a / 2736612/716865
Muhannad A.Alhariri
Ich habe es erfolgreich mit Objekten verwendet, die aus Webservices generiert wurden, indem ich einen Anwendungsbereich hatte, Mapin dem die Objekte mithilfe eines Bezeichners gespeichert und abgerufen werden. Das einzige wirkliche Problem bei diesem Ansatz ist, dass Android nach einer Weile den Speicher löscht, sodass Sie in Ihrem onResume nach Nullen suchen müssen (ich denke, dass Objekte, die in Absichten übergeben wurden, bestehen bleiben, aber nicht sicher sind). Abgesehen davon sehe ich dies nicht als wesentlich minderwertig an.
Saad Farooq
Dies ist die beste Antwort. Es zeigt, wie verschiedene Aktivitäten auf dasselbe Datenmodell verweisen können. Ich habe viel zu lange gebraucht, um das zu entdecken!
Markus
6
Implementieren Sie in Ihrem Klassenmodell (Objekt) Serializable, zum Beispiel:
oder eine serialisierbare Klasse erstellen, um sie an eine andere Aktivität zu übergeben, was auch immer Sie übergeben möchten.
UMAR
9
Denken Sie daran, keine großen, fetten Gegenstände zu platzieren. Die Lebensdauer dieses Objekts entspricht der Lebensdauer der Anwendung. Und niemals Ansichten speichern. Diese Methode garantiert auch Speicherlecks.
Reno
1
Diese Antwort ist nützlich, aber keine bessere Lösung in Bezug auf Speicher- und Ressourcenoptimierung
Atul Bhardwaj
1
Dies bricht die OOP-Prinzipien, indem globale Variablen eingeführt werden. Man weiß nie, in welchem Zustand sie sich befinden, ob sie gesetzt sind oder nicht, sie werden von vielen Threads verwendet und man muss sich mit dieser Komplexität auseinandersetzen. Es ist normalerweise ein guter Speicherverlust, da Sie nicht einmal wissen, wann Sie diese Variablen freigeben müssen. Um nicht zu sagen, dass es eine harte direkte Kopplung zwischen verschiedenen Modulen der Anwendung einführt.
Afrika
2
WTF? Die anderen beiden Antworten sind viel besser.
IcyFlame
4
Sie können die Methoden putExtra (Serializable ..) und getSerializableExtra () verwenden, um Objekte Ihres Klassentyps zu übergeben und abzurufen. Sie müssen Ihre Klasse Serializable markieren und sicherstellen, dass alle Ihre Mitgliedsvariablen auch serialisierbar sind ...
Geben Sie den Projektnamen ein: android-pass-object-to-activity
Pakcage: com.hmkcode.android
Behalten Sie andere Auswahlmöglichkeiten bei, gehen Sie zu Weiter, bis Sie Fertig stellen erreichen
Bevor wir mit der Erstellung der App beginnen, müssen wir die POJO-Klasse „Person“ erstellen, mit der wir Objekte von einer Aktivität zu einer anderen senden. Beachten Sie, dass die Klasse eine serialisierbare Schnittstelle implementiert.
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 +"]";}}
Zwei Layouts für zwei Aktivitäten
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());}}
Mit der Gson-Bibliothek von Google können Sie Objekte an andere Aktivitäten übergeben. Tatsächlich konvertieren wir Objekte in Form von JSON-Zeichenfolgen und konvertieren sie nach Übergabe an andere Aktivitäten erneut in Objekte wie diese
Wir müssen das Objekt der Beispielklasse übergeben
Example exampleObject=newExample(1,"hello");String jsonString =newGson().toJson(exampleObject);Intent nextIntent=newIntent(this,NextActivity.class);
nextIntent.putExtra("example",jsonString );
startActivity(nextIntent);
Zum Lesen müssen wir in NextActivity den umgekehrten Vorgang ausführen
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);
Wenn Sie eine Singleton-Klasse (fx Service) haben, die ohnehin als Gateway zu Ihrer Modellebene fungiert, kann dies gelöst werden, indem in dieser Klasse eine Variable mit Get- und Setter-Elementen vorhanden ist.
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.}
Diese Lösung erfordert keine Serialisierung oder andere "Verpackung" des betreffenden Objekts. Es ist jedoch nur dann von Vorteil, wenn Sie diese Art von Architektur verwenden.
Was sind die Nachteile dieses Ansatzes? Es scheint so logisch und schlank. Ich habe immer gelesen, dass Sie das nicht tun sollten, aber ich bekomme nie eine gute Erklärung dafür, was schief gehen könnte.
Markus
Da ich meinen Kommentar nicht mehr bearbeiten kann: Ist dies nicht die einzig mögliche Lösung, um einen Verweis auf ein Objekt anstelle einer Kopie zu erhalten? Ich muss das gleiche Objekt abrufen und keine Kopie!
Markus
Ich denke, dies wird aufgrund der hohen Kopplung, zu der es führt, etwas entmutigt. Aber ja, soweit ich sehen kann, ist dieser Ansatz am sinnvollsten, wenn Sie das eigentliche Objekt benötigen. Wie immer in der Programmierung können Sie tun, was Sie wollen, Sie wollen es nur vorsichtig tun. Diese Lösung hat bei mir funktioniert und ich bevorzuge sie, da ich diese Architektur sowieso verwende.
Kitalda
Eigentlich habe ich die Application-Klasse erweitert und mein Datenmodell dort gespeichert. In den Absichten habe ich nur die ID der Datenobjekte weitergeleitet, mit denen das ursprüngliche Objekt aus der Anwendungsklasse abgerufen werden konnte. Außerdem benachrichtigt die erweiterte Anwendungsklasse alle Objekte, die das Datenmodell verwenden, wenn es sich über ein Standard-Listener-Konzept ändert. Ich weiß, dass dies nur für meinen Fall passt, in dem ich ein Datenmodell für die gesamte Anwendung freigeben muss, aber für diesen Fall ist es perfekt und es werden auch keine statischen Klassen und Felder benötigt!
Markus
2
IMHO bei weitem der einfachste Weg, Objekte zu paketieren. Sie fügen einfach ein Anmerkungs-Tag über dem Objekt hinzu, das Sie paketierbar machen möchten.
Bei einer anderen Aktivität abrufen (YourActivity)
String s = getIntent().getStringExtra("USER_NAME");
Dies ist für einfache Datentypen in Ordnung. Wenn Sie jedoch komplexe Daten zwischen den Aktivitäten übergeben möchten, müssen Sie diese zuerst serialisieren.
Antworten:
Wenn Sie nur Objekte herumreichen, wurde Parcelable dafür entwickelt. Es erfordert ein wenig mehr Aufwand , um den Einsatz als Java native Serialisierung verwenden, aber es ist viel schneller (und ich meine Art und Weise, WAY schneller).
Ein einfaches Beispiel für die Implementierung aus den Dokumenten ist:
Beachten Sie, dass Sie in dem Fall, in dem Sie mehr als ein Feld von einem bestimmten Paket abrufen müssen, dies in derselben Reihenfolge tun müssen, in der Sie es eingegeben haben (dh bei einem FIFO-Ansatz).
Sobald Sie Ihre Objekte implementieren
Parcelable
es ist nur eine Frage von ihnen in Putten Intents mit putExtra () :Dann können Sie sie mit getParcelableExtra () wieder herausziehen :
Wenn Ihre Objektklasse Parcelable und Serializable implementiert, stellen Sie sicher, dass Sie eine der folgenden Optionen verwenden:
quelle
Sie müssen Ihr Objekt in eine Art Zeichenfolgendarstellung serialisieren. Eine mögliche Zeichenfolgendarstellung ist JSON, und eine der einfachsten Möglichkeiten, um von / nach JSON in Android zu serialisieren, ist, wenn Sie mich fragen, Google GSON .
In diesem Fall geben Sie einfach den Zeichenfolgenrückgabewert von ein,
(new Gson()).toJson(myObject);
rufen den Zeichenfolgenwert ab und verwenden ihnfromJson
, um ihn wieder in Ihr Objekt umzuwandeln.Wenn Ihr Objekt jedoch nicht sehr komplex ist, ist es möglicherweise den Aufwand nicht wert, und Sie können stattdessen die separaten Werte des Objekts übergeben.
quelle
String s = (new Gson().toJson(client));
und dannCli client = new Gson().fromJson(s, Cli.class);
Sie können serialisierbare Objekte absichtlich senden
quelle
Serializable
aber nichtParcelable
, lohnt es sich selten, es zu machenParcelable
.Verwenden Sie in Situationen, in denen Sie wissen, dass Sie Daten innerhalb einer Anwendung übergeben, "Globals" (wie statische Klassen).
Hier ist, was Dianne Hackborn (hackbod - ein Google Android Software Engineer) zu diesem Thema zu sagen hatte:
quelle
Ihre Klasse sollte Serializable oder Parcelable implementieren.
Sobald Sie fertig sind, können Sie ein Objekt auf putExtra senden
Um Extras zu bekommen, müssen Sie nur noch tun
Wenn Ihre Klasse Parcelable implementiert, verwenden Sie next
Ich hoffe es hilft: D.
quelle
Serializable
ist falsch. Die Klasse kannParcelable
zum Beispiel implementieren .Serializable
es sich um eine Standard-Java-Oberfläche handelt,Parcelable
ist es Android-spezifisch. In Bezug auf die Leistung ist Parcelable effizienter: developerphil.com/parcelable-vs-serializableKurze Antwort für schnelle Bedürfnisse
1. Implementieren Sie Ihre Klasse in Serializable.
Wenn Sie innere Klassen haben, vergessen Sie nicht, diese auch in Serializable zu implementieren !!
2. Setzen Sie Ihr Objekt in Absicht
3. Und erhalten Sie Ihr Objekt in der anderen Aktivitätsklasse
quelle
Wenn Ihre Objektklasse implementiert ist
Serializable
, müssen Sie nichts weiter tun. Sie können ein serialisierbares Objekt übergeben.das ist was ich benutze.
quelle
Implementieren Sie serialisierbar in Ihrer Klasse
Dann können Sie dieses Objekt absichtlich übergeben
In der zweiten Aktivität können Sie solche Daten erhalten
Wenn die Daten jedoch groß werden, ist diese Methode langsam.
quelle
Sie können Android BUNDLE verwenden, um dies zu tun.
Erstellen Sie ein Bundle aus Ihrer Klasse wie folgt:
Dann übergeben Sie dieses Bundle mit INTENT. Jetzt können Sie Ihr Klassenobjekt neu erstellen, indem Sie ein Bundle wie übergeben
Deklarieren Sie dies in Ihrer benutzerdefinierten Klasse und verwenden Sie es.
quelle
Es gibt verschiedene Möglichkeiten, auf Variablen oder Objekte in anderen Klassen oder Aktivitäten zuzugreifen.
Eine Datenbank
B. gemeinsame Einstellungen.
C. Objektserialisierung.
D. Eine Klasse, die allgemeine Daten enthalten kann, kann als Common Utilities bezeichnet werden, abhängig von Ihnen.
E. Weitergabe von Daten über Absichten und Paketschnittstelle.
Dies hängt von Ihren Projektanforderungen ab.
A. Datenbank
SQLite ist eine Open Source-Datenbank, die in Android eingebettet ist. SQLite unterstützt standardmäßige relationale Datenbankfunktionen wie SQL-Syntax, Transaktionen und vorbereitete Anweisungen.
Tutorials - http://www.vogella.com/articles/AndroidSQLite/article.html
B. Gemeinsame Einstellungen
Angenommen, Sie möchten den Benutzernamen speichern. Es gibt also jetzt zwei Dinge: einen Schlüsselbenutzernamen , Wert Wert.
Wie zu speichern
Mit putString (), putBoolean (), putInt (), putFloat (), putLong () können Sie Ihren gewünschten Datentyp speichern.
Wie zu holen
http://developer.android.com/reference/android/content/SharedPreferences.html
C. Objektserialisierung
Die Objektserialisierung wird verwendet, wenn ein Objektstatus gespeichert werden soll, um ihn über das Netzwerk zu senden, oder wenn Sie ihn auch für Ihren Zweck verwenden können.
Verwenden Sie Java-Bohnen und speichern Sie sie als eines seiner Felder. Verwenden Sie dafür Getter und Setter
JavaBeans sind Java-Klassen mit Eigenschaften. Stellen Sie sich Eigenschaften als private Instanzvariablen vor. Da sie privat sind, können sie nur über Methoden in der Klasse von außerhalb ihrer Klasse aufgerufen werden. Die Methoden, die den Wert einer Eigenschaft ändern, werden als Setter-Methoden bezeichnet, und die Methoden, die den Wert einer Eigenschaft abrufen, werden als Getter-Methoden bezeichnet.
Stellen Sie die Variable in Ihrer Mail-Methode mit ein
Verwenden Sie dann das Objekt Serialzation, um dieses Objekt zu serialisieren, und deserialisieren Sie dieses Objekt in Ihrer anderen Klasse.
Bei der Serialisierung kann ein Objekt als eine Folge von Bytes dargestellt werden, die die Daten des Objekts sowie Informationen über den Objekttyp und die im Objekt gespeicherten Datentypen enthält.
Nachdem ein serialisiertes Objekt in eine Datei geschrieben wurde, kann es aus der Datei gelesen und deserialisiert werden, dh die Typinformationen und Bytes, die das Objekt und seine Daten darstellen, können verwendet werden, um das Objekt im Speicher neu zu erstellen.
Wenn Sie ein Tutorial dazu wünschen, verweisen Sie auf diesen Link
http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html
Variable in anderen Klassen abrufen
D. CommonUtilities
Sie können selbst eine Klasse erstellen, die allgemeine Daten enthalten kann, die Sie häufig in Ihrem Projekt benötigen.
Stichprobe
E. Weitergabe von Daten durch Absichten
In diesem Tutorial finden Sie Informationen zum Übergeben von Daten.
http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/
quelle
Vielen Dank für die Hilfe bei Paketen, aber ich habe eine weitere optionale Lösung gefunden
In Aktivität Eins
Daten in Aktivität 2 abrufen
quelle
Ich benutze Gson mit seiner so mächtigen und einfachen API, um Objekte zwischen Aktivitäten zu senden.
Beispiel
Mit 2 Funktionen fügen Sie sie den Objekten hinzu, die Sie senden möchten
Verwendungszweck
Objekt von A nach B senden
In B empfangen
Ich benutze es fast in jedem Projekt, das ich mache, und ich habe keine Leistungsprobleme.
quelle
Ich hatte mit dem gleichen Problem zu kämpfen. Ich habe es mithilfe einer statischen Klasse gelöst und alle gewünschten Daten in einer HashMap gespeichert. Darüber hinaus verwende ich eine Erweiterung der Standard-Aktivitätsklasse, in der ich die Methoden onCreate an onDestroy überschrieben habe, um den Datentransport und die Datenlöschung versteckt durchzuführen. Einige lächerliche Einstellungen müssen geändert werden, z. B. Orientierungshandhabung.
Anmerkung: Das Nicht-Bereitstellen allgemeiner Objekte, die an eine andere Aktivität weitergegeben werden sollen, ist ein Schmerz im Arsch. Es ist, als würde man sich ins Knie schießen und hoffen, 100 Meter zu gewinnen. "Parcable" ist kein ausreichender Ersatz. Es bringt mich zum Lachen ... Ich möchte diese Schnittstelle nicht in meine technologiefreie API implementieren, da ich weniger eine neue Ebene einführen möchte ... Wie könnte es sein, dass wir in der mobilen Programmierung so weit weg sind modernes Paradigma ...
quelle
In Ihrer ersten Aktivität:
Und in deinem zweiten:
Vergessen Sie nicht, Ihr benutzerdefiniertes Objekt serialisierbar zu machen:
quelle
Eine andere Möglichkeit, dies zu tun, besteht darin, das
Application
Objekt (android.app.Application) zu verwenden. Sie definieren dies in IhrerAndroidManifest.xml
Datei als:Sie können dies dann von jeder Aktivität aus aufrufen und das Objekt in der
Application
Klasse speichern .In der FirstActivity:
Führen Sie in der zweiten Aktivität Folgendes aus:
Dies ist praktisch, wenn Sie Objekte mit Anwendungsbereich haben, dh sie müssen in der gesamten Anwendung verwendet werden. Die
Parcelable
Methode ist immer noch besser, wenn Sie eine explizite Kontrolle über den Objektbereich wünschen oder wenn der Bereich begrenzt ist.Dies vermeidet jedoch die Verwendung von
Intents
insgesamt. Ich weiß nicht, ob sie zu dir passen. Eine andere Möglichkeit, die ich verwendet habe, besteht darin,int
Bezeichner von Objekten durch Absichten senden zu lassen und Objekte abzurufen, die ich in Maps imApplication
Objekt habe.quelle
Map
in dem die Objekte mithilfe eines Bezeichners gespeichert und abgerufen werden. Das einzige wirkliche Problem bei diesem Ansatz ist, dass Android nach einer Weile den Speicher löscht, sodass Sie in Ihrem onResume nach Nullen suchen müssen (ich denke, dass Objekte, die in Absichten übergeben wurden, bestehen bleiben, aber nicht sicher sind). Abgesehen davon sehe ich dies nicht als wesentlich minderwertig an.Implementieren Sie in Ihrem Klassenmodell (Objekt) Serializable, zum Beispiel:
und deine erste Aktivität
und Ihre zweite Aktivität (NewActivity)
Viel Glück!!
quelle
Daten übergeben:
Daten abrufen:
quelle
Die einfachste Lösung, die ich gefunden habe, ist .. eine Klasse mit statischen Datenelementen mit Getter-Setzern zu erstellen.
Setze von einer Aktivität und erhalte von einer anderen Aktivität dieses Objekt.
Aktivität A.
Aktivität b
quelle
Sie können die Methoden putExtra (Serializable ..) und getSerializableExtra () verwenden, um Objekte Ihres Klassentyps zu übergeben und abzurufen. Sie müssen Ihre Klasse Serializable markieren und sicherstellen, dass alle Ihre Mitgliedsvariablen auch serialisierbar sind ...
quelle
Erstellen Sie eine Android-Anwendung
Datei >> Neu >> Android-Anwendung
Geben Sie den Projektnamen ein: android-pass-object-to-activity
Pakcage: com.hmkcode.android
Behalten Sie andere Auswahlmöglichkeiten bei, gehen Sie zu Weiter, bis Sie Fertig stellen erreichen
Bevor wir mit der Erstellung der App beginnen, müssen wir die POJO-Klasse „Person“ erstellen, mit der wir Objekte von einer Aktivität zu einer anderen senden. Beachten Sie, dass die Klasse eine serialisierbare Schnittstelle implementiert.
Person.java
Zwei Layouts für zwei Aktivitäten
activity_main.xml
activity_another.xml
Zwei Aktivitätsklassen
1) ActivityMain.java
2) AnotherActivity.java
quelle
Mit der Gson-Bibliothek von Google können Sie Objekte an andere Aktivitäten übergeben. Tatsächlich konvertieren wir Objekte in Form von JSON-Zeichenfolgen und konvertieren sie nach Übergabe an andere Aktivitäten erneut in Objekte wie diese
Betrachten Sie eine Bean-Klasse wie diese
Wir müssen das Objekt der Beispielklasse übergeben
Zum Lesen müssen wir in NextActivity den umgekehrten Vorgang ausführen
Fügen Sie diese Abhängigkeit in Gradle hinzu
quelle
quelle
Ich weiß, dass dies spät ist, aber es ist sehr einfach. Alles, was Sie tun müssen, ist, Ihre Klasse Serializable wie implementieren zu lassen
dann können Sie zu einer Absicht wie übergehen
Um es zu bekommen, rufst du einfach an
quelle
Wenn Sie eine Singleton-Klasse (fx Service) haben, die ohnehin als Gateway zu Ihrer Modellebene fungiert, kann dies gelöst werden, indem in dieser Klasse eine Variable mit Get- und Setter-Elementen vorhanden ist.
In Aktivität 1:
In Aktivität 2:
Im Dienst:
Diese Lösung erfordert keine Serialisierung oder andere "Verpackung" des betreffenden Objekts. Es ist jedoch nur dann von Vorteil, wenn Sie diese Art von Architektur verwenden.
quelle
IMHO bei weitem der einfachste Weg, Objekte zu paketieren. Sie fügen einfach ein Anmerkungs-Tag über dem Objekt hinzu, das Sie paketierbar machen möchten.
Ein Beispiel aus der Bibliothek finden Sie unter https://github.com/johncarl81/parceler
quelle
Implementieren Sie zuerst Parcelable in Ihrer Klasse. Dann übergeben Sie das Objekt wie folgt.
SendActivity.java
ReceiveActivity.java
Die Paketzeichenfolge ist nicht erforderlich, nur die Zeichenfolge muss in beiden Aktivitäten identisch sein
REFERENZ
quelle
Starten Sie eine andere Aktivität von diesem Aktivitätsübergabeparameter über Bundle Object
Bei einer anderen Aktivität abrufen (YourActivity)
Dies ist für einfache Datentypen in Ordnung. Wenn Sie jedoch komplexe Daten zwischen den Aktivitäten übergeben möchten, müssen Sie diese zuerst serialisieren.
Hier haben wir das Mitarbeitermodell
Sie können die von Google bereitgestellte Gson lib verwenden, um die komplexen Daten wie folgt zu serialisieren
quelle
In Koltin
Fügen Sie die Kotlin-Erweiterung in Ihr build.gradle ein.
Erstellen Sie dann Ihre Datenklasse wie folgt.
Objekt mit Absicht übergeben
Objekt mit Absicht abrufen
quelle
Die einfachste und Java-Methode ist: Implementieren Sie serialisierbar in Ihrer Pojo / Modellklasse
Empfohlen für Android für die Leistungsansicht: Modell paketierbar machen
quelle
Am einfachsten wäre es, nur Folgendes zu verwenden, wenn das Element eine Zeichenfolge ist:
Für den Empfang:
quelle