Skickar data mellan aktiviteter på Android. Kommunikation mellan Aktivitet och Service. Vem ramade in katten Vaska – vi får tillbaka resultatet

13.04.2022

Applikationen består inte alltid av en enda skärm. Vi har till exempel skapat ett mycket användbart program och användaren vill veta vem dess författare är. Han klickar på knappen "Om" och kommer till en ny skärm där det finns användbar information om versionen av programmet, författaren, webbplatsens adress, hur många katter författaren har, etc. Se en aktivitetsskärm som en webbsida med en länk till en annan sida. Om du tittar på koden i filen MainActivity.java från tidigare lektioner kommer du att se att vår klass Huvudaktivitet gäller även Aktivitet(eller hans arvingar) eller, för att vara mer exakt, ärvt från honom.

Public class MainActivity utökar AppCompatActivity

Som du kanske gissar borde vi skapa en ny klass som kan se ut Huvudaktivitet och sedan på något sätt byta till det på knappklick.

För experimentet kommer vi att ta programmet från första lektionen och använda en knapp för experiment (eller skapa ett nytt projekt med en knapp på skärmen). Låt oss sedan skapa ett nytt formulär för att visa användbar information. Låt oss till exempel visa användaren vad katten gör när den går åt vänster och höger. Håller med, detta är mycket viktig information som ger nyckeln till att nysta upp universum.

Vi kommer att skapa en ny aktivitet manuellt, även om studion har färdiga mallar. Men det är inget komplicerat och för en bättre förståelse är det användbart att göra allt för hand.

Låt oss skapa en ny XML-uppmärkningsfil activity_about.xml i mappen res/layout. Högerklicka på mappen layout och välj från snabbmenyn Nytt | Layoutresursfil. En dialogruta visas. Ange filnamnet i det första fältet aktivitet_om. I det andra måste du ange rotelementet. Som standard finns den där Constraint Layout. Radera text och skriv in rullningsvy. Att ange några tecken räcker för att studion ska föreslå färdiga alternativ, du kan omedelbart trycka på Enter utan att vänta på den fullständiga inmatningen av ordet:

Vi får motsvarande blankett, i vilken vi infogar elementet textvy.

Information kommer att hämtas från resurser, nämligen från en strängresurs about_text. Nu är den markerad i rött, vilket signalerar frånvaron av information. kunde tryckas Alt+Enter och skriv in text i dialogrutan. Men för vårt exempel kommer den här metoden inte att fungera, eftersom vår text kommer att vara flerradig med kontrolltecken. Så låt oss göra det annorlunda. Låt oss öppna filen res/values/strings.xml och skriv in följande text manuellt:

En grön ek nära havet;\n En gyllene kedja på den eken:\n Dag och natt vetenskapsman katt\n Allt går runt kedjan;\n Det går rätt- låten slås på,\n Vänster- berättar en saga.

Vi använde de enklaste HTML-textformateringstaggarna som , , . För vårt exempel räcker det att feta orden som hänvisar till katten och rörelseriktningen. För att översätta text till en ny rad, använd symbolerna \n. Låt oss lägga till ytterligare en strängresurs för titeln på den nya skärmen:

Om programmet

Förstås med markering. Därefter måste du skapa en klass för fönstret AboutActivity.java. Välj från menyn fil | Nytt | Java klass och fyll i de obligatoriska fälten. Till en början räcker det att endast ange namnet. Ta sedan hand om andra områden.

Låt oss ta förberedelserna.

Nu är klassrummet nästan tomt. Låt oss lägga till koden manuellt. Klassen måste ärva från den abstrakta klassen Aktivitet eller dess släktingar FragmentActivity, AppCompatActivity etc. Lägger till utökar aktiviteten. Aktivitetsklassen ska ha en metod onCreate(). Placera muspekaren i klassen och välj från menyn kod | Åsidosätt metoder(Ctrl+O). I dialogrutan letar vi efter önskad klass, du kan skriva de första tecknen på tangentbordet för en snabb sökning. I den skapade metoden måste du anropa metoden setContentView(), som kommer att ladda den förberedda markeringen på skärmen. Vi kommer att ha ett sådant alternativ.

Paket en.alexanderklimov.helloworld; importera android.app.Activity; importera android.os.Bundle; /** * Skapad av Alexander Klimov den 12/01/2014. */ public class AboutActivity utökar aktivitet ( @Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); ) )

Nu börjar det viktigaste. Vår uppgift är att flytta till en ny skärm när en knapp klickas på den första skärmen. Låt oss gå tillbaka till klassen Huvudaktivitet. Låt oss skriva knappklickshanteraren:

Public void onClick(View view) (Intent intent = new Intent(MainActivity.this, AboutActivity.class); startActivity(intent); )

Här använde jag hanteringsmetoden för knappklick som beskrivs i lektionen.

För att starta en ny skärm måste du skapa en instans av klassen Avsikt och ange den aktuella klassen i den första parametern, och klassen för övergången i den andra, vi har detta Om Aktivitet. Därefter kallas metoden startActivity(), vilket startar en ny skärm.

Om du nu försöker testa applikationen i emulatorn får du ett felmeddelande. Vad gjorde vi för fel? Vi missade ett viktigt steg. Du måste registrera en ny Aktivitet i manifestet AndroidManifest.xml. Hitta den här filen i ditt projekt och dubbelklicka på den. Fönstret för filredigering öppnas. Lägg till en ny tagg efter den avslutande taggen för den första aktiviteten. Skriv på egen hand och använd tips aktivt. Du får följande:

Det är här strängresursen kommer väl till pass about_title. Kör programmet, klicka på knappen och få fram fönstret Om programmet. Således lärde vi oss hur man skapar ett nytt fönster och anropar det med ett knapptryck. Och ett megabekvämt program har dykt upp till vårt förfogande - nu kommer det alltid finnas en hint till hands vad katten gör när den går till vänster.

Återigen vill jag uppmärksamma er på att den andra skapade aktivitetsklassen måste ärvas från klassen Aktivitet eller liknande ( ListActivity etc.), har en XML-uppmärkningsfil (om så krävs) och skrivs i manifestet.

Efter att ha anropat metoden startActivity() en ny aktivitet kommer att starta (i detta fall Om Aktivitet), kommer den att bli synlig och flyttas till toppen av stapeln som innehåller de löpande komponenterna. När du anropar en metod Avsluta() från den nya aktiviteten (eller när hårdvarubakåtstegstangenten trycks ned) kommer den att stängas och tas bort från stacken. Utvecklaren kan också navigera till föregående (eller någon annan) aktivitet med samma metod startActivity().

Skapa en tredje skärm - ett sätt för de lata

Programmerare, som katter, är lata varelser. Kom alltid ihåg att du för aktiviteten behöver skapa uppmärkning och en klass som ärver från Aktivitet, och glöm sedan inte att registrera klassen i manifestet - jaha, vad fan.

I det här fallet väljer du från menyn fil | Nytt | aktivitet | grundläggande aktivitet(eller annat mönster). Därefter visas det välbekanta fönstret för att skapa en ny aktivitet. Fyll i de obligatoriska fälten.

Klicka på knappen Avsluta och aktiviteten kommer att vara klar. För att verifiera detta, öppna manifestfilen och leta efter den nya posten. Jag pratar inte om klassfiler och uppmärkning, de kommer att dyka upp framför dig.

Lägg till en ny knapp på skärmen för huvudaktiviteten själv och skriv koden för att navigera till den skapade aktiviteten.

Först skulle jag råda dig att manuellt skapa alla nödvändiga komponenter för en ny aktivitet för att förstå förhållandet mellan klassen, markeringen och manifestet. Och när du får tag på det kan du använda guiden för att skapa aktiviteter för att påskynda saker.

Skicka data mellan aktiviteter

Vi använde det enklaste exemplet för att anropa en annan aktivitetsskärm. Ibland krävs det inte bara att anropa en ny skärm, utan också att överföra data till den. Till exempel användarnamn. I det här fallet måste du använda ett speciellt område extraData, som klassen har Avsikt.

Område extraDataär en lista över par nyckelvärde, som skickas tillsammans med avsikten. Strängar används som nycklar, och för värden kan du använda alla primitiva datatyper, arrayer av primitiver, klassobjekt bunt och så vidare.

För att skicka data till en annan aktivitet, använd metoden putExtra():

Intent.putExtra("Nyckel", "Värde");

Den mottagande aktiviteten bör anropa någon lämplig metod: getIntExtra(), getStringExtra() etc.:

Int count = getIntent().getIntExtra("namn", 0);

Låt oss göra om det föregående exemplet. Vi har redan tre aktiviteter. Den första aktiviteten kommer att ha två textfält och en knapp. Utseendet kan vara som följer:

Vid den andra aktiviteten SecondActivity ställ in elementet textvy, där vi kommer att visa texten från den första aktiviteten. Låt oss skriva följande kod för metoden onCreate() vid den andra aktiviteten.

@Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); String user = "Animal"; String present = "munkhål"; TextView infoTextView = (TextView)find RViewById .id.textViewInfo); infoTextView.setText(användare + " , du fick " + gåva); )

Om vi ​​nu kör programmet och helt enkelt anropar det andra fönstret, som beskrivs i den första delen av artikeln, kommer vi att se standardinskriften ZhYvotnoe, du fick ett munkhål. Håller med, det är ganska synd att få sådana meddelanden.

Vi fixar situationen. Lägg till kod till den första aktiviteten:

Public void onClick(View view) ( EditText userEditText = (EditText) findViewById(R.id.editTextUser); EditText giftEditText = (EditText) findViewById(R.id.editTextGift); Intent intention.Second class); // tryck in texten från det första textfältet till användarnamnsnyckeln intent.putExtra("användarnamn", userEditText.getText().toString()); // tryck in texten från det andra textfältet till presentnyckeln intent.putExtra("gåva", giftEditText.getText().toString()); startActivity(avsikt); )

Vi placerade i en speciell föremålsbehållare Avsikt två nycklar med värden hämtade från textfält. När användaren anger data i textfälten hamnar de i den här behållaren och skickas till den andra aktiviteten.

Den andra aktiviteten ska vara redo att varmt ta emot meddelanden enligt följande (markerad med fet stil).

// Standardvärden String user = "LIFE"; String present = "munkhål"; user = getIntent().getExtras().getString("användarnamn"); gift = getIntent().getExtras().getString("gift"); TextView infoTextView = (TextView)findViewById(R.id.textViewInfo); infoTextView.setText(användare + " , du fick " + present);

Nu ser budskapet inte så stötande ut, men till och med trevligt för vissa. I komplexa exempel är det önskvärt att lägga till validering under databehandling. Det finns situationer när du startar en andra aktivitet med tomma data som null, vilket kan krascha programmet.

I vårt fall vet vi att vi väntar på ett strängvärde, så koden kan skrivas om så här:

intent intent = getIntent(); user = intent.getStringExtra("användarnamn");

User = getIntent().getStringExtra("användarnamn");

Programmet har en nackdel - det framgår inte från vem vi får hälsningar. Alla väluppfostrade apor kommer inte att acceptera en gåva från en anonym källa. Så för läxor, lägg till ett annat textfält för att ange namnet på användaren som skickar meddelandet.

Google rekommenderar att du använder följande format för nycklar: ditt paketnamn som prefix, följt av själva nyckeln. I det här fallet kan du vara säker på att nyckeln är unik när du interagerar med andra applikationer. Ungefär så här:

Public final static String USER = "ru.alexanderklimov.myapp.USER";

Vem ramade in katten Vaska – vi får tillbaka resultatet

Det räcker inte alltid att bara skicka data till en annan aktivitet. Ibland behöver man få tillbaka information från en annan aktivitet när den är stängd. Om vi ​​tidigare använde metoden startActivity(Intent intent), så finns det en relaterad metod startActivityForResult(Intent intent, int RequestCode). Skillnaden mellan metoderna ligger i den extra parametern begär kod. Det är i princip bara ett heltal som du kan tänka på själv. Det är nödvändigt för att skilja från vem resultatet kom. Låt oss säga att du har fem extra skärmar och du tilldelar värden från 1 till 5 till dem, och från den här koden kan du bestämma vems resultat du behöver bearbeta. Du kan använda värdet -1, då blir det likvärdigt med att anropa metoden startActivity(), dvs. vi får inget resultat.

Om du använder metoden startActivityForResult(), då måste du åsidosätta metoden i koden för att få resultatet onActivityResult() och bearbeta resultatet. Förvirrad? Låt oss ta en titt på ett exempel.

Låt oss säga att du är en detektiv. Information inkom om att två korvbitar och andra produkter stals från bordet hos en inflytelserik person i restaurangen. Misstanke föll på tre misstänkta - en kråka, en jävla hund och katten Vaska.

En av besökarna gav en serie bilder från sin ponton iPhone:


Det finns också vittnesmål från ett annat vittne: Och Vaska lyssnar och äter.

Vi skapar ett nytt projekt Sherlock med två aktiviteter. På den första skärmen kommer det att finnas en knapp för att växla till den andra skärmen och en textetikett som visar namnet på tjuven.