Hoe geef ik een object door van de ene activiteit naar de andere op Android?

Ik moet één object in meerdere activiteiten binnen mijn app kunnen gebruiken, en het moet hetzelfde hetzelfdeobject zijn. Wat is de beste manier om dit te doen?

Ik heb geprobeerd het object “openbaar statisch” te maken, zodat het toegankelijk is voor andere activiteiten, maar om de een of andere reden snijdt dit het gewoon niet. Is er een andere manier om dit te doen?


Antwoord 1, autoriteit 100%

Wanneer u een intentieobject maakt, kunt u profiteren van de volgende twee methoden:
voor het doorgeven van objecten tussen twee activiteiten.

putParcelable

putSerializable

U kunt uw klas Parcelableof Serializable. Vervolgens kunt u uw aangepaste lessen doorgeven aan activiteiten. Ik vond dit erg handig.

Hier is een klein stukje code dat ik gebruik

CustomListing currentListing = new CustomListing();
Intent i = new Intent();
Bundle b = new Bundle();
b.putParcelable(Constants.CUSTOM_LISTING, currentListing);
i.putExtras(b);
i.setClass(this, SearchDetailsActivity.class);
startActivity(i);

En in nieuw gestarte activiteitscode zal zoiets als dit zijn…

Bundle b = this.getIntent().getExtras();
if (b != null)
    mCurrentListing = b.getParcelable(Constants.CUSTOM_LISTING);

Antwoord 2, autoriteit 26%

U kunt een subklasse van Applicatiemaken en uw gedeelde object opslaan Daar. Het Application-object zou moeten bestaan ​​voor de levensduur van uw app, zolang er een actieve component is.

Vanuit uw activiteiten heeft u toegang tot het toepassingsobject via getApplication().


Antwoord 3, autoriteit 26%

Dit antwoord is specifiek voor situaties waarin de door te geven objecten een geneste klassenstructuur hebben. Met geneste klassenstructuur is het een beetje vervelend om het Parcelable of Serializeable te maken. En het proces van het serialiseren van een object is niet efficiënt op Android. Beschouw het onderstaande voorbeeld,

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

Met de GSON-bibliotheekvan Google kunt u een object rechtstreeks ontleden in een JSON-geformatteerde String en converteer het na gebruik terug naar het objectformaat. Bijvoorbeeld,

MyClass src = new MyClass();
Gson gS = new Gson();
String target = gS.toJson(src); // Converts the object to a JSON String

Je kunt deze String nu doorgeven aan activiteiten als een StringExtra met de activiteitsintentie.

Intent i = new Intent(FromActivity.this, ToActivity.class);
i.putExtra("MyObjectAsString", target);

Maak vervolgens in de ontvangende activiteit het originele object van de tekenreeksweergave.

String target = getIntent().getStringExtra("MyObjectAsString");
MyClass src = gS.fromJson(target, MyClass.class); // Converts the JSON String to an Object

Het houdt de originele klassen schoon en herbruikbaar. Vooral als deze klasseobjecten als JSON-objecten van het web worden gemaakt, is deze oplossing zeer efficiënt en tijdbesparend.

UPDATE


Hoewel de hierboven uitgelegde methode in de meeste situaties werkt, moet u om voor de hand liggende prestatieredenen niet vertrouwen op het gebundelde extra systeem van Android om objecten door te geven. Er zijn een aantal oplossingen die dit proces flexibel en efficiënt maken, hier zijn er een paar. Elk heeft zijn eigen voor- en nadelen.

  1. Eventbus
  2. Otto

Antwoord 4, autoriteit 5%

Misschien is het een onpopulair antwoord, maar in het verleden heb ik gewoon een klasse gebruikt die een statische verwijzing heeft naar het object dat ik wil behouden door middel van activiteiten. Dus,

public class PersonHelper
{
    public static Person person;
}

Ik heb geprobeerd het pad van de Parcelable-interface te volgen, maar kwam er een aantal problemen mee tegen en de overhead in je code was onaantrekkelijk voor mij.


Antwoord 5, autoriteit 4%

Dit hangt af van het type gegevens waartoe u toegang nodig hebt. Als je een soort datapool hebt die moet blijven bestaan ​​in Activitys, dan is Erichs antwoord de juiste keuze. Als u slechts een paar objecten van de ene activiteit naar de andere moet doorgeven, kunt u ze Serializablelaten implementeren en ze doorgeven in de extra’s van de Intentom de nieuwe Activity.


Antwoord 6, autoriteit 4%

Uw object kan ook de Parcelable-interface implementeren. Vervolgens kunt u de methode Bundle.putParcelable()gebruiken en uw object doorgeven tussen activiteiten binnen de bedoeling.

De Photostream-toepassing gebruikt deze aanpak en kan worden gebruikt als een referentie.

Other episodes