Hur man skickar data mellan aktiviteter med Android

Introduktion

Vi behöver ofta skicka data mellan Aktiviteter i en Android-app. Ett enkelt sätt att göra detta är med Intent.putExtra (), men om du har mycket strukturerade data för att passera, kan Parcelable vara en bättre lösning. I det här inlägget visar jag hur Parcelable gör det enkelt att serialisera klasser för att dela mellan aktiviteter.

Varför jämförbart?

Parcelable är ett Android-only-gränssnitt. Det gör det möjligt för utvecklare att serialisera en klass så att dess egenskaper enkelt överförs från en aktivitet till en annan. Detta görs genom att läsa och skriva objekt från Parcels, som kan innehålla utplattad data i meddelandebehållare. 

Skapa huvudaktivitet och layout

Vår huvudsakliga aktivitet kommer att hantera samlingen av bokinformationen. Låt oss börja med att skapa vår onCreate metod.

paketet com.tutsplus.code.android.bookparcel; importera android.support.v7.app.AppCompatActivity; importera android.os.Bundle; public class MainActivity utökar AppCompatActivity @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); // ...

Nästa, öppna activity_main.xml för att konfigurera vyens layout och utseende. Du behöver två textfält och en knapp för inlämning.

Det ska se ut så här:

    

Öppna nu din huvudaktivitet och länka vyfälten till din aktivitet. Du måste göra det inuti din onCreate () metod, så här:

 // ... final EditText mBkTitle = (EditText) findViewById (R.id.title); Final EditText mBkAuthor = (EditText) findViewById (R.id.author); Knappknapp = (Knapp) findViewById (R.id.submit_button);

För att avsluta Huvudaktivitet, du måste ställa in en onClickListener. Detta kommer att kallas när Lämna knappen trycks in. När det händer ska de inmatade uppgifterna samlas in och skickas till nästa aktivitet.

 button.setOnClickListener (new View.OnClickListener () @Override public void onClick (Visa v) Bokbok = ny bok (mBkTitle.getText (). toString (), mBkAuthor.getText (). toString ()); = Ny Intent (MainActivity.this, BookActivity.class); intention.putExtra ("Book", bok); startActivity (intention););

Här lägger du till en onClickListener till Knapp exempel du hämtat från din aktivitetslayout. Denna kod kommer att köras när Lämna knappen klickas. 

Observera att vi helt enkelt passerar bok till exempel putExtra (). Som vi ser senare, tar Parcelable hand om serialisering av bokdata till en sträng så att den kan överföras via avsikt.

Nu när huvudaktiviteten är klar måste vi skapa vår BookActivity såväl som bokklassen för att hålla bokinformation.

Skapa bokklassen

Låt oss skapa en bok klass för att hålla info om varje bok.

public class Book implementer Parcelable // boken basics private String title; privatsträngare författare; 

Denna klass måste genomföras Parcelable. Detta gör det möjligt att överföra data från Huvudaktivitet till BookActivity.

Vi lägger också till några standard getter-funktioner och en konstruktör för att snabbt skapa en förekomst av klassen.

 // huvudkonstruktörens offentliga bok (String title, String author) this.title = title; this.author = author;  // getters public String getTitle () return title;  Offentlig String getAuthor () Returförfattare; 

Skriv till paketet

De writeToParcel Metod är där du lägger till all din klassdata till paketet. Detta görs för att förbereda överföringen. Den här metoden kommer att skickas till ett paket-instans som har ett antal skrivmetoder som du kan använda för att lägga till varje fält i paketet. Se upp: Ordern där du skriver data är viktig!

Så här gör du det.

 // skriva objektvärden till paket för lagring public void writeToParcel (Parcel dest, int flaggor) dest.writeString (title); dest.writeString (författare); 

Läs data tillbaka från paketet

Precis som skrivmetoden hanterar att skriva data som ska överföras används konstruktorn för att läsa överförda data tillbaka från det serialiserade paketet. Denna metod kommer att kallas på mottagningsaktiviteten för att samla in data.

Så här ska det se ut:

 allmän bok (paketpaket) title = parcel.readString (); författare = parcel.readString (); 

Den mottagande aktiviteten kommer att få data som en sträng och kommer då att ringa till getParcelableExtra metod för att starta processen med att samla in data. Det kommer att utlösa konstruktören vi definierade ovan, vilket kommer att deserialisera data och skapa en ny bok exempel. 

Parcelable.Creator

För att slutföra din jämförbara klass måste du skapa en Parcelable.Creator instans och tilldela den till SKAPARE fält. API-paketet letar efter det här fältet när det behöver deserialiseras en förekomst av din klass som har överförts till en annan komponent.

 offentlig statisk slutlig Parcelable.Creator CREATOR = ny Parcelable.Creator() @Override public Book createFromParcel (Parcel paket) returnera ny bok (paket);  @Override public Book [] newArray (int size) returnera ny bok [0]; ;

Detta binder allt ihop. Dess jobb är enkelt - det genererar instanser av din jämförbara klass från en Paket med hjälp av paketinformationen som tillhandahålls. Skaparen kallar konstruktören du definierade ovan och skickar den a Paket objekt och konstruktorn initierar klassattributen.

Om din jämförbara klass kommer att ha barnklasser, måste du ta extra försiktighet med describeContents () metod. Detta låter dig identifiera den specifika barnklassen som ska skapas av Parcelable.Creator. Du kan läsa mer om hur det här fungerar på Stack Overflow.

Bokaktivitet och layout

Nu kan vi slutföra vår app med bokaktiviteten. Fortsätt och skapa en ny tom aktivitet som heter BookActivity. Gör layouten så som vad jag har nedan.

    

I activity_book.xml, du behöver bara två Textview widgets, som kommer att användas för att visa titeln och författaren till böckerna.

Nu ska vi inrätta vår verksamhet. Din verksamhet borde redan se ut så här:

paketet com.tutsplus.code.android.bookparcel; importera android.support.v7.app.AppCompatActivity; importera android.os.Bundle; public class BookActivity utökar AppCompatActivity @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_book); 

I den här aktiviteten vill du ta emot de data som skickades från din huvudsakliga aktivitet och visa den på dina synpunkter. Således kommer du att hämta dina exempel Textview använder ID av Textview Ange i din layout.

 TextView mBkTitle = (TextView) findViewById (R.id.bk_title); TextView mBkAuthor = (TextView) findViewById (R.id.bk_author);

Då förstår du naturligtvis getIntent () eftersom du kommer att hämta data i den här aktiviteten. Uppgifterna som du hämtar samlas in från boksklassen med getParcelableExtra (). Därefter ställer du in värdena för TextViews till de data du samlade in. Så här är det gjort.

 Avsikten med avsikt = getIntent (); Bokbok = intent.getParcelableExtra ("Book"); mBkTitle.setText ("Titel:" + book.getTitle ()); mBkAuthor.setText ("Författare:" + book.getAuthor ());

Bygg din ansökan och starta den, och du bör se den lilla skönheten du just byggt.

Slutsats

I det här inlägget har du sett hur du enkelt kan flytta objekt från en aktivitet till en annan. Du behöver inte längre hämta varje datafält som du skickat till Intent-objektet separat, och du behöver inte komma ihåg det namn som du passerade varje fält under. Inte bara det, men processen är snabbare än Java serialiseringsfunktionalitet.

I den här handledningen har du lärt dig hur du använder Parcelable för att skicka data från en aktivitet till en annan. Du kan dyka djupare in i Parcelable genom att kontrollera den officiella dokumentationen. 

Under tiden, kolla in några av våra andra inlägg om Android app utveckling!