Adattovábbítás a tevékenység és a szolgáltatás között. Kommunikáció a tevékenység és a szolgáltatás között

Egy alkalmazás nem mindig egyetlen képernyőből áll. Például létrehoztunk egy nagyon hasznos programés a felhasználó tudni akarja, hogy ki a szerző. Rákattint az "A programról" gombra, és egy új képernyőre kerül, ahol hasznos információk találhatók a program verziójáról, a szerzőről, a webhely címéről, hány macskája van a szerzőnek stb. Képzelje el a tevékenység képernyőt úgy, mint egy weboldalt, amely egy másik oldalra mutató hivatkozást tartalmaz. Ha megnézed a kódot a fájlban MainActivity.java az előző leckékből látni fogja, hogy osztályunk Fő tevékenység is vonatkozik Tevékenység(vagy örökösei), pontosabban tőle örököltek.

A MainActivity nyilvános osztály kiterjeszti az AppCompatActivity-t

Ahogy sejtheti, létre kell hoznunk egy új osztályt, ami így nézhet ki Fő tevékenység majd a gomb megnyomásakor valahogy átváltani rá.

A kísérlethez az első lecke programját vesszük, és a kísérletekhez (vagy létrehozáshoz) használjuk a gombot új projekt egy gombbal a képernyőn). Ezután hozzunk létre új forma megjeleníteni hasznos információ... Például mutassuk meg a felhasználónak, mit csinál a macska, amikor jobbra-balra jár. Egyetértek, ez nagyon fontos információ, támpontot adva az univerzumhoz.

Egy új tevékenységet manuálisan fogunk létrehozni, bár a stúdióban vannak kész sablonok. De nincs semmi bonyolult, és a jobb megértés érdekében hasznos mindent kézzel csinálni.

Hozzon létre egy új XML jelölőfájlt activity_about.xml a mappában res / elrendezés... Kattintson jobb gombbal a mappára elrendezésés válassz közülük helyi menü Új | Elrendezési erőforrásfájl... Megjelenik egy párbeszédpanel. Az első mezőbe írja be a fájl nevét tevékenység_körül... A másodikban meg kell adnia a gyökérelemet. Alapértelmezés szerint van ConstraintLayout... Törölje a szöveget és írja be ScrollView... Néhány karakter beírása elegendő ahhoz, hogy a stúdió kész lehetőségeket javasoljon, azonnal nyomja meg az Entert, anélkül, hogy megvárná a szó teljes bevitelét:

Megkapjuk a megfelelő ürességet, amelybe beillesztjük az elemet. TextView.

Az információk forrásokból, nevezetesen egy karakterlánc-erőforrásból kerülnek lekérésre about_text... Most pirossal van kiemelve, jelezve az információhiányt. Nyomhatnál Alt + Enterés írjon be szöveget a párbeszédpanelbe. De a mi példánkban ez a módszer nem fog működni, mivel a szövegünk többsoros lesz, vezérlőkaraktereket használva. Tehát csináljuk másként. Nyissuk meg a fájlt res / értékek / strings.xmlés kézzel írja be a következő szöveget:

Zöld tölgy a tengerparton; \ n Arany lánc a tölgyen: \ n Éjjel-nappal tudós macska\ n Minden láncban forog; \ n megy jobb- kezdődik a dal, \ n Bal- mondja egy mese.

A legegyszerűbb HTML szövegformázó címkéket használtuk, mint pl , , ... Példánkhoz elég vastag betűvel kiemelni a macskára és a mozgásirányra utaló szavakat. Szöveg fordításához új sor szimbólumokat használjon \ n... Adjunk hozzá egy másik karakterlánc-erőforrást az új képernyő címéhez:

A programról

Kitaláltuk a jelölést. Ezután létre kell hoznia egy osztályt az ablakhoz AboutActivity.java... Válasszon a menüből Fájl | Új | Java osztályés töltse ki a kötelező mezőket. Eleinte elég csak a nevet feltüntetni. Akkor foglalkozz más területekkel.

Vegyünk egy ürességet.

Az osztály már majdnem üres. Adjuk hozzá a kódot manuálisan. Az osztálynak örökölnie kell az absztrakt osztálytól Tevékenység vagy rokonai hasonlók FragmentActivity, AppCompatActivity stb. tesszük hozzá kiterjeszti a tevékenységet... A tevékenységosztálynak rendelkeznie kell metódussal onCreate ()... Az egérkurzort az osztályba helyezzük, és kiválasztjuk a menüből Kód | Módszerek felülbírálása(Ctrl + O). A párbeszédablakban keressük a kívánt osztályt, amelyhez a billentyűzet első karaktereit beírhatja gyors keresés... A létrehozott metódusban meg kell hívni a metódust setContentView () amely betölti az elkészített jelölést a képernyőre. Meg fogjuk kapni ezt a lehetőséget.

ru.alexanderklimov.helloworld csomag; import android.app.Activity; import android.os.Bundle; / ** * Készítette: Alexander Klimov 2014.12.01. * / public class Az AboutActivity kiterjeszti az aktivitást (@Override protected void onCreate (Bundle savedInstanceState) (super.onCreate (savedInstanceState); setContentView (R.layout.activity_about);))

Most kezdődik a legfontosabb. A feladatunk az, hogy az első képernyő gombjára kattintva új képernyőre lépjünk. Menj vissza az osztályba Fő tevékenység... Írjunk egy gombkattintás-kezelőt:

Public void onClick (nézet nézet) (Intent intent = new Intent (MainActivity.this, AboutActivity.class); startActivity (intent);)

Itt azt a módszert alkalmaztam a gombkattintások kezelésére, amelyet a leckében leírtam.

Új képernyő indításához létre kell hoznia az osztály példányát Elszántés az első paraméterben adja meg az aktuális osztályt, a második paraméterben pedig az átmenet osztályát, ez megvan AboutActivity... Ezt követően a módszer ún tevékenység indítása () amely új képernyőt indít el.

Ha most megpróbálja tesztelni az alkalmazás működését az emulátorban, hibaüzenetet fog kapni. Mit csináltunk rosszul? Kihagytunk egy fontos lépést. Újat kell regisztrálnia Tevékenység a manifesztben AndroidManifest.xml... Keresse meg ezt a fájlt a projektben, és kattintson rá duplán. Megnyílik a fájlszerkesztő ablak. Új címke hozzáadása a záró címke után az első tevékenységhez. Nyomtassa ki magát, és használja aktívan az utasításokat. Az eredmény a következő:

Szóval jól jött a karakterlánc erőforrás about_title... Indítsa el az alkalmazást, kattintson a gombra, és nyissa meg az ablakot A programról... Így megtanultuk, hogyan lehet új ablakot létrehozni és egy gombnyomással meghívni. És rendelkezésünkre áll egy nagyon kényelmes program - most mindig kéznél lesz egy tipp, hogy mit csinál a macska, amikor balra megy.

Még egyszer felhívom a figyelmet arra, hogy a második létrehozott tevékenységosztálynak örökölnie kell az osztálytól Tevékenység vagy hozzá hasonló ( ListActivityés mások), rendelkezzen XML-jelölőfájllal (ha szükséges), és szerepeljen a jegyzékben.

A módszer felhívása után tevékenység indítása ()új tevékenység indul (ebben az esetben AboutActivity), láthatóvá válik, és a futó komponenseket tartalmazó verem tetejére kerül. A módszer hívásakor Befejez () egy új tevékenységből (vagy ha egy kemény visszatérési billentyűt lenyomnak) bezárul és kikerül a veremből. A fejlesztő ugyanezzel a módszerrel navigálhat az előző (vagy bármely más) tevékenységhez. tevékenység indítása ().

Hogyan hozzunk létre egy harmadik képernyőt - egy módja a lustáknak

A programozók, akárcsak a macskák, lusta lények. Mindig ne feledje, hogy a tevékenységhez jelölést és egy osztályt kell létrehoznia, amely örököl Tevékenység, majd ne felejtsd el regisztrálni az osztályt a manifestben - hát nafig.

Ebben az esetben válassza ki a menüből Fájl | Új | Tevékenység | Alaptevékenység(vagy más sablon). Ezután megjelenik az ismerős ablak egy új tevékenység létrehozásához. A kötelező mezőket kitöltjük.

Kattintson a gombra Befejezés kész lesz a tevékenység. Ennek ellenőrzéséhez nyissa meg a jegyzékfájlt, és keressen új bejegyzést. Nem az osztály- és jelölőfájlokról beszélek, ezek maguk fognak megjelenni előtted.

Adjon hozzá egy új gombot a fő tevékenységi képernyőhöz, és írja be a kódot a létrehozott tevékenységhez való ugráshoz.

Először azt tanácsolom, hogy manuálisan hozza létre az összes szükséges összetevőt egy új tevékenységhez, hogy megértse az osztály, a jelölés és a jegyzék közötti kapcsolatot. Ha pedig kézbe veszi, a Tevékenység-létrehozó varázsló segítségével felgyorsíthatja munkáját.

Adatátvitel a tevékenységek között

A legegyszerűbb példát használtuk egy másik tevékenység képernyő meghívására. Néha nemcsak új képernyőt kell hívni, hanem adatokat is át kell vinni rá. Például felhasználónév. Ebben az esetben speciális területet kell használnia extraData hogy az osztály rendelkezik Elszánt.

Vidék extraData a párok listája kulcs érték amit a szándékkal együtt adnak át. A karakterláncokat kulcsként használják, és értékekhez bármilyen primitív adattípust, primitív tömböt, osztályobjektumot használhat Csomag satöbbi.

Az adatok másik tevékenységbe való átviteléhez használja a módszert putExtra ():

Intent.putExtra ("Kulcs", "Érték");

A fogadó tevékenységnek valamilyen megfelelő módszert kell hívnia: getIntExtra (), getStringExtra () stb.:

Int count = getIntent (). GetIntExtra ("név", 0);

Ismételjük meg az előző példát. Már három tevékenységünk van. Az első tevékenységnek két szövegmezője és egy gombja lesz. A megjelenés a következő lehet:

A második tevékenység SecondActivity telepítse az elemet TextView, amelyben az első tevékenységből kapott szöveget jelenítjük meg. Írjuk a metódushoz a következő kódot onCreate () a második tevékenységnél.

@Override protected void onCreate (Bundle savedInstanceState) (super.onCreate (savedInstanceState); setContentView (R.layout.activity_second); String user = "Élő"; String gift = "fánklyuk"; TextView infoTextView = (TextView) R.ViewById R.View id.textViewInfo); infoTextView.setText (felhasználó + ", kaptál" + ajándék);)

Ha most elindítjuk a programot, és csak a második ablakot hívjuk meg, a cikk első részében leírtak szerint, akkor az alapértelmezett címkét fogjuk látni Zhivotnoe, kaptál egy fánkot... Egyetértek, kár ilyen üzeneteket kapni.

Javítjuk a helyzetet. Adja hozzá az első tevékenység kódját:

Public void onClick (Nézet megtekintése) (EditText userEditText = (EditText) findViewById (R.id.editTextUser); EditText giftEditText = (EditText) findViewById (R.id.editTextGift); /Új Intentity (osztály) / az első szövegmező szövegét benyomni a felhasználónév kulcsába intent.putExtra ("felhasználónév", userEditText.getText (). toString ()); // a szöveget a második szövegmezőből benyomni az ajándékkulcsba intent.putExtra ( "ajándék", ajándékEditText.getText (). toString ()); startActivity (intent);)

Elhelyeztünk egy tárgyat egy speciális tartályba Elszánt két kulcs szövegmezőkből vett értékekkel. Amikor a felhasználó adatokat ír be a szövegmezőkbe, ebbe a tárolóba kerül, és átkerül a második tevékenységbe.

A második tevékenységnek készen kell állnia meleg üzenetek fogadására az alábbiak szerint (félkövéren).

// Alapértelmezett értékek String user = "Élő"; String ajándék = "fánk lyuk"; user = getIntent (). getExtras (). getString ("felhasználónév"); ajándék = getIntent (). getExtras (). getString ("ajándék"); TextView infoTextView = (TextView) findViewById (R.id.textViewInfo); infoTextView.setText (felhasználó + ", kaptál" + ajándék);

Most az üzenet nem tűnik olyan sértőnek, de egyesek számára még kellemes is. Összetett példákban kívánatos az érvényesítés hozzáadása az adatok feldolgozásakor. Vannak helyzetek, amikor a második tevékenységet üres adatokkal kezdi, mint pl nulla ami összeomolhatja az alkalmazást.

Esetünkben tudjuk, hogy egy karakterlánc értékre várunk, így a kód így átírható:

Intent intent = getIntent (); user = intent.getStringExtra ("felhasználónév");

User = getIntent (). GetStringExtra ("felhasználónév");

A programnak van egy hátránya - nem világos, hogy kitől kapunk üdvözletet. Egyetlen jól nevelt majom sem fogad el ajándékot névtelen forrásból. Tehát házi feladatként adjon hozzá egy másik szövegmezőt az üzenetet küldő felhasználó nevének megadásához.

A Google a következő formátum használatát javasolja a kulcsokhoz: a csomag neve előtagként, majd maga a kulcs. Ebben az esetben biztos lehet benne, hogy a kulcs egyedi, amikor más alkalmazásokkal kommunikál. Valami ilyesmi:

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

Ki keretezte Vaska macskát – visszakapjuk az eredményt

Nem mindig elegendő egyszerűen átadni az adatokat egy másik tevékenységnek. Néha szükség van arra, hogy információkat szerezzenek vissza egy másik tevékenységből, amikor az le van zárva. Ha korábban használtuk a módszert startActivity (Intent intent), akkor van egy kapcsolódó módszer startActivityForResult (Intent intent, int RequestCode)... A metódusok közötti különbség az extra paraméter RequestCode... Ez alapvetően csak egy egész szám, amelyet magad is kitalálhatsz. Azért van rá szükség, hogy meg lehessen különböztetni, kitől származott az eredmény. Tegyük fel, hogy van öt további képernyője, és 1 és 5 közötti értékeket rendel hozzájuk, és ebből a kódból meghatározhatja, hogy melyik eredményt kell feldolgoznia. Használhatja a -1 értéket, akkor az ugyanaz lesz, mint a metódus meghívása tevékenység indítása (), azaz semmi eredményt nem érünk el.

Ha használja a módszert startActivityForResult (), akkor felül kell írnia a kódban szereplő metódust, hogy megkapja az eredményt onActivityResult ()és feldolgozza az eredményt. Zavaros? Vegyünk egy példát.

Tegyük fel, hogy nyomozó vagy. Információk szerint egy étteremben egy befolyásos személy asztaláról loptak el két darab kolbászt és egyéb termékeket. Három gyanúsítottra esett a gyanú - egy varjúra, egy kibaszott kutyusra és Vaskára a macskára.

Az egyik látogató egy fotósorozatot adott ponty iPhone-járól:


Van egy másik tanú vallomása is: Vaska pedig hallgat, de eszik.

Hozzon létre egy új projektet Sherlock két tevékenységgel. Az első képernyőn lesz egy gomb, amellyel a második képernyőre válthat, és egy szöveges címke, amelyen a tolvaj neve jelenik meg.