Komunikácia medzi činnosťou a službou. Prepínanie medzi aplikačnými obrazovkami prenosu dát medzi Activeti
Nejako som mal úlohu preniesť dáta zo služby do Activu. Vyhľadávanie riešení v štandardnom SDK začalo, ale keďže neexistoval čas, potom odletel zlé riešenie ako databázové použitie. Ale otázka bola otvorená a po nejakom čase som prišiel na správnejšiu cestu, ktorá je v SDK - pomocou tried správ, handler, messenger.
Nápad
Musíme prenášať údaje z aktivácie do služby a späť. Ako to robíme? Ak chcete vyriešiť našu úlohu, už máme všetko, čo potrebujete. Všetko, čo potrebujete, je viazať servis na zmiernenie pomocou Bindservice, preneste požadované parametre a trochu mágie vo forme používania tried správ. A mágia je použitie premenných inštancií správ a najmä odpoveďou. Táto premenná je pre nás potrebná, aby sme mohli poukázať na inštanciu služby Messanger z Activeti a v službe na Messanger-kópiu. V skutočnosti nie je to tak jednoduché. Aspoň pre moju nie na najvyvešenejšiu myseľ. Zároveň zlepšujem dokumentáciu, ktorá už je - Služby dobrý príklad na stackoverflow. V každom prípade dúfam, že článok bude užitočný aspoň niekým a ja som sa neodvážil, že nie zbytočne.
Príklad
Ako príklad, implementujeme službu, ktorá zvýši a znižuje hodnotu počítadla a vráti výsledok aktivity v textovom zozname. Kód rozloženia je vynechaný, pretože existujú dve tlačidlá a textové pole - všetko je jednoduché.
Predaja
Dám plne Activat kód:
MAKINAKTORÁ TRIEDA TRIEDA TRIEDA TRIEDAVA AKTIVITY (Public Static Final String Tag \u003d "TestService"; TestserviceConnection Testserconn; TextView TestTXT; Konečný Messenger Messenger \u003d Nový Messenger (Nový NESPRÁVNYHOBUDE (). OnCreate (Savedinstancestate); SETCONTENTVIEW; TestTextText \u003d (TextView) FindViewBed (R.id.test_txt); Bindservice (Nový zámer), (testservconn \u003d Nové testserviceConnection ()), kontext .bind_auto_create);) @override Public Void Onestroy () super.ondestroy (); Unbedservice (testservconn);) Public Void CountInCRCLIK (Tlačidlo Zobraziť) (NULL, testservice.count_plus); Msg.ReplyTice \u003d Messenger; vyskúšať (ToserviceMessenger.send (MSG);) Úlovok (napr. ;)) Public Void CountDecrClick (Tlačidlo zobrazenia) (NULL, testservice.count_minus); msg .Replyto. \u003d posol; Skúste (ToserviceMessenger.send (MSG);) Úlovok (E.printstacktrace ();)) SÚKROMNÁ TRIEDA TRIEDA NAJVYŠŠIACHUJÚCIU SÚKROMNÁ TRIEDA TRIEDY SÚKROMNÁ TRIEDA Aktivita) ... Získajte počet "); Testtxt.Settext (" "+ msg.arg1); Break;)))) SÚKROMNÁ TRIEDA TRIEDY TRUHYVERIČNÁCIECNOSTI Účinky Služby (@overnide Public Void OnserviceConnected (Názov komponenty, iBinder Service) (ToserviceMessenger \u003d Nový Messenger) ; // Odoslať počiatočnú hodnotu správy Msg \u003d správa.Orobtain counter (, testservice.set_count); msg.Replyto \u003d messenger; msg.arg1 \u003d 0; // náš counter vyskúšať (ToserticeMessenger.send (MSG);) Úlovok (REMOTEException e) (E.printstacktrace ();)) @override Public Void OnservisIdisconnected (Názov komponentov)))
Vysvetlím. Pri vytváraní ACTIVE, sme okamžite viazaní na službu, implementáciu servisného rozhrania a odosielame správu "Nastaviť servis počítadla", ktorá prejde nulou a vytváraním TosericEMessransher, prejdením rozhranie iBinder pre dizajnérovi. Mimochodom, v službe je potrebné vrátiť tento eHEMPLE, inak bude NPE. S touto triedou posielame správu služby. A tu je to mágia - uložíme našu inú inštanciu Messenger do variabilnej odpovede - ten, ktorý prijíma odpoveď zo servera a to je cez to, ktorá bude komunikovať s Active.
Ak chcete prijať správu zo služby, použite svoj obslužný program a hľadajte premenné, ktoré potrebujeme a urobíme akcie. Klikne na tlačidlá (CountInCrrcrick, CountDecrClick metódy), pošlite požiadavky na službu, pričom zadajte požadovanú akciu v msg.wat premennej.
Balenia com.example.servicetest; Import android.App.service; Import Android.content. *; Import Android.os. *; Import android.os.process; Import Android.util.log; Trieda verejnej triedy TestService rozširuje službu (verejná statická finálna finále Int_plus \u003d 1; verejný statical final int count_minus \u003d 2; verejný statical final int set_count \u003d 0; verejný statical finalt int get_count \u003d 3; int count \u003d 0; NESMIETERNÍCTOU ToActivityMessenger; @Override Public Void Oncreate () (super.oncreate (); HandlerThread Thread \u003d New HandlerThread ("ServiceStartarGuments", proces.Thread_priority_background); Thread.start (); Inclunler \u003d Nový NESPRÁVNY (Thread.getLooper ()); MesSanger \u003d Nový Messenger (Inclunler);) @override verejné ibinder onbind (návrat medsanger.getbinder ();) @override verejné zámery Onstartcommand (návrat štart_sticky;) // Správa Manipulácia AKTIVITY SÚKROMNÁ TRIEDA SÚKROMNÁ TRIEDA (Looper Looper) @Override Public Void HandleMessage (správa MSG) (//super.handleMessage(Msg); ToActivityMess enger \u003d msg.replyto; Prepínač (msg.what \u003d msg.arg1; log.d (mainActivity.Tag, "(Service) ... Nastaviť počet"); Break; Case Count_Plus: Count ++; Log.D (MACEACTIVITY.TAG, "(SERVIS ) ... Count Plus "); Break; Case Count_minus: Log.D (MACACTIVITY.TAG," (SERVICE) ... Počet mínus "); počet--; Break;) // Pošlite meračovú hodnotu Outmsg \u003d správa.obtain (inhander, get_count); outmsg.arg1 \u003d počet; outmsg.replyto \u003d mesranger; Skúste (ak (aktivitaMessenger! \u003d Null) toaktivityMessenger.send (outmsg);) úlovok (E.printstacctrace ();)))
All analógia s logikou v aktivovaní. Ani neviem, či potrebujete niečo vysvetliť. Jediným momentom je, že som okamžite odoslal žiadosť späť na aktiváciu v handleMessage, pomocou magických variabilných odpovedí a ťahaním vyššie uvedeného messengeru vyššie. A druhý moment, ktorý som už povedal, je:
@Override verejné ibder onbind (zámer arg0) (návrat medsanger.getbinder ();)
bez toho, čo všetko spadne. Toto je táto inštancia rozhrania, ktorá bude prenášaná na služby.
Záver
Všeobecne platí, že všetko. Takýto príklad interakcie Aktivity a služieb. Zdá sa mi, že non-triviálna interakcia je pekná, aj keď sa niekto môže zdať inak.
Otázky, objasnenia a iné v PM. Môžu existovať nepresnosť o akýchkoľvek aspektoch, takže neváhajte písať a narovnať.
Dúfam, že príspevok bol užitočný pre čitateľov.
Posledná aktualizácia: 04/03/2018
Pre prenos údajov medzi dvomi aktivitami sa používa zámerný objekt. Prostredníctvom svojej metódy publikácie () môžete pridať kľúč a súvisiacu hodnotu.
Napríklad, vysielanie zo súčasnej aktivity v druhej aktivite "Hello World" reťazce s kľúčom "Ahoj":
// Vytvorenie úmyselného objektu na spustenie Dodávky Intension Intens \u003d Nový zámer (tento, setupAktivita.class); // Prenos objektu s kľúčom "Hello" a "Hello World" Hodnota Intent.puppuxtra ("Ahoj", "Ahoj Svet"); // Začiatok štartktivity Nodávky (zámer);
Metóda Pulextra () sa používa na prenos dát, ktoré ako hodnota umožňuje preniesť najjednoduchšie typy typových dát - reťazec, Int, plavák, dvojlôžkové, dlhé, krátke, bajt, char, polia týchto typov, alebo Serializačný objekt rozhrania.
Ak chcete získať odoslané údaje pri načítaní nastavení, môžete použiť dostať.(), v ktorom sa objekt prenáša:
Bundle Arguments \u003d getintent (). GetExtras (); Názov string \u003d Arguments.Get ("Ahoj"). Tostring (); // Hello World.
V závislosti od typu dát odoslaných, pri prijatí, môžeme použiť niekoľko metód objektu zväzkov. Všetky z nich prijímajú objekt ako parameter. Hlavné sú:
dostať (): univerzálna metódaktorá vráti hodnotu typu objektu. V súlade s tým sa pole o príjme musí byť prevedené na požadovaný typ
getstring (): vráti reťazec typu objektu
getint (): vráti hodnotu typu int
getByte (): vráti hodnotu typu Byte
getchar (): vráti hodnotu typu char
getshort (): vráti hodnotu krátkeho typu
getlong (): vráti dlhú hodnotu
getfloat (): vráti hodnotu typu plavák
getdouble (): vráti dvojitú hodnotu
getBoolean (): Vracia hodnotu typu Boolean
getMarRarray (): Vráti pole CHARP objektov
getintarray (): vráti pole objektov INT
getfloatarray (): vráti pole plavákových objektov
getserializable (): Vracia objekt Serializable Interface
Dovoľte nám, aby sme v projekte definovali dve aktivity: MainActivity a druhá
V kóde o druhom čase určíme získanie údajov:
Balenie com.example.eugene.serializeApp; Import android.support.v7.Papp.AppCompaTActivity; Import android.os.bundle; Import Android.widget.TextView; Trieda verejnej triedy Rozšíri AppCompaTActivity (@override chránený Void Oncreate (Bundle SavedInstancestate) (Super.oncreate (SavedInstacestate); TextView TextView \u003d Nový textViete (this); TextView.settextSize (20); TextView.SetPadding (16, 16, 16, 16, 16 ); Bundle Arguments \u003d getintent (). GetExtras (); ak (argumenty! \u003d Null) (Názov string \u003d Argments.Get). TOSTRING (); String Company \u003d Arguments.getString ("Company"); Int Cena \u003d Argumenty. getint ("cena"); TextView.settext ("Názov:" + NAME + "NOCOMPANY:" + Company + "NPRICE:" + cena);) SETCONTENTVIEW (TEXTVIEW);)
V tomto prípade, v druhom prípade dostávame všetky údaje z objektu zväzku a zobrazí ich v textovom poli TextView. Predpokladá sa, že táto aktivita bude prenášaná tri prvky - dva riadky s názvom a firemnými kľúčmi a kľúčom s kľúčovou cenou.
Teraz budeme definovať prenos na druhú aktivitu údajov. Napríklad definujeme ďalšie rozhranie pre nedostatočnosť v súbore Activity_main.xml:
Tu sú tri textové polia pre zadávanie údajov a tlačidlo.
V triede mimo prevádzky definujeme nasledujúci obsah:
Balenie com.example.eugene.serializeApp; Import android.content.intent; Import android.support.v7.Papp.AppCompaTActivity; Import android.os.bundle; Import Android.view.View; Import android.widget.edittext; MACKAKTIVITA TRIEDAUJÚCEJ TRIEDA TRIEDAUKTIVITA PROSTREDNOSTI APPLYCOMPATAKTIVITA (@OVERIDIDE CHRÁNENÉ VOZIDLOSTI ONCREATION (BUNDLE SAFEEDIMSTANTSATESTATE) (super.oncreate (SavedInstancestate); SETCONTENTVIEW (R.LAYOUT.ACTIVITY_MAIN);) Public Void Onclick (Zobraziť v) (Final Edittext Mentext \u003d FindViewById (R.D .Name); Final Edittext CompanyText \u003d FindViewById (R.id.comPany); Final Edittext Provint \u003d FindViewById (R.id.Price); Názov stringu \u003d Názov (); String Company \u003d CompanyText.getText Company ) .ToString (); Int Cena \u003d Integer.Parseint (ProvinText.getText (). TOSTRING ()); Intension Intens \u003d Nový zámer (tento, DUSELNACTIVITY.CLASS); Intent.putExtra ("názov", názov); úmysel. Putextra ("spoločnosť", spoločnosť); intent.putlextra ("cena", cena); Startactivity (zámer);)
V tlačidle stlačením tlačidla získate údaje zadané v textových poliach, údajoch a prenášajú ich do zámerového objektu pomocou metódy publikácie (). Potom spustite druhú aktivitu.
V dôsledku toho, keď kliknete na tlačidlo spustí druhú aktivitu, ktorá dostane niektoré údaje zadané v textových poliach.
Prenos komplexných objektov
V príklade sa vysielali jednoduché údaje - čísla, riadky. Môžeme však prenášať aj ťažšie údaje. V tomto prípade sa používa serializačný mechanizmus.
Napríklad, poďme v projekte bude definovaný triedou výrobku:
Balenie com.example.eugene.serializeApp; Dovoz java.io.serializable; Produkt verejnej triedy implementuje serializovateľné (súkromný názov reťazca; súkromná reťazec company; súkromná int cena; verejný produkt (názov reťazca, reťazec, Int cena) (this.name \u003d názov; this.Price \u003d spoločnosť; this.Price \u003d cena;) Verejný reťazec GetName () (Názov návratu;) Verejné Void SetName (Názov stringu) (This.Name \u003d Meno;) Verejný reťazec GetCompany () (Späť Company;) Verejné Void Setcompany (String Company) (THERKOUSKOPLANY \u003d spoločnosť;) Verejný int getpics () (návratová cena;) Public Vul SetPrice (Int cena) (this.Price \u003d;)
Stojí za zmienku, že táto trieda implementuje serializovateľné rozhranie. Teraz zmeníte kmeňový kód:
Balenie com.example.eugene.serializeApp; Import android.content.intent; Import android.support.v7.Papp.AppCompaTActivity; Import android.os.bundle; Import Android.view.View; Import android.widget.edittext; MACKAKTIVITA TRIEDAUJÚCEJ TRIEDA TRIEDAUKTIVITA PROSTREDNOSTI APPLYCOMPATAKTIVITA (@OVERIDIDE CHRÁNENÉ VOZIDLOSTI ONCREATION (BUNDLE SAFEEDIMSTANTSATESTATE) (super.oncreate (SavedInstancestate); SETCONTENTVIEW (R.LAYOUT.ACTIVITY_MAIN);) Public Void Onclick (Zobraziť v) (Final Edittext Mentext \u003d FindViewById (R.D .Name); Final Edittext CompanyText \u003d FindViewById (R.id.comPany); Final Edittext Provint \u003d FindViewById (R.id.Price); Názov stringu \u003d Názov (); String Company \u003d CompanyText.getText Company ) .ToString (); int Cena \u003d Integer.Parseint (ProCText.getText (). TOSTRING ()); produktový produkt \u003d nový produkt (názov, spoločnosť, cena); zámerový úmysel \u003d nový zámer (tento, setupAktivita.class); Intent.puspextra (produkt.class.getsimplename (), produkt); StarterActivity (zámer);)
Namiesto troch rozptýlených údajov sa prenáša jeden objekt produktu. Výsledkom je výsledok metódy produktu.class.getsimplename (), ktorý v podstate vracia názov triedy.
A zmeniť triedu Dodávky:
Balenie com.example.eugene.serializeApp; Import android.support.v7.Papp.AppCompaTActivity; Import android.os.bundle; Import Android.widget.TextView; Trieda verejnej triedy Rozšíri AppCompaTActivity (@override chránený Void Oncreate (Bundle SavedInstancestate) (Super.oncreate (SavedInstacestate); TextView TextView \u003d Nový textViete (this); TextView.settextSize (20); TextView.SetPadding (16, 16, 16, 16, 16 ); Argumenty zväzkov \u003d getintent (). GetExtras (); konečný produktový produkt; ak (argumenty! \u003d Null) (produkt \u003d (produkt) argumenty.GetSerializable (product.class.getSimpLename ()); TextView.settext ("Názov: "+ Product.getName () +" ncompany: "+ product.getCompany () +" NPRICE: "+ string.Valueof (produkt.getPrice ()));) SETCONTENTVIEW (TEXTVIEW);)
Metóda getserializable () sa aplikuje na získanie údajov, pretože trieda produktu implementuje serializovateľné rozhranie. Môžeme teda namiesto vytáčania rozdielnych dát prenášať jeden jediný objekt.
Ahoj.
Musíte odovzdať údaje získané prostredníctvom UART v aktivitách. To možno vykonať vytvorením prúdu v činnosti, v ktorej sa organizuje kým cyklus (! IsterErouted ()) a odosielať údaje z vyrovnávacej pamäte UART. Potom, volaním tokom UI prúdom aktivity - nedokonalosť.This.RunonuitHRead (New Runnable (), vykonajte potrebné kroky s touto činnosťou. Ale ak nazývame inú činnosť z hlavnej aktivity, potom organizované vlákno neumožňuje prenášať Údaje na novovytvorenú aktivitu. Ak správne pochopím, takže údaje z prúdu môžu byť prenesené na akúkoľvek činnosť, tok musí byť vytvorený nie je v činnosti, ale v prevádzke.
Otázka: UAR dostal dáta, v potoku (ktorý je vytvorený v službe), je potrebné preniesť údaje na aktivitu, ktorá je teraz aktívna, ako to môže byť vykonané a je to vôbec?
1 odpoveď
V každej aktivite vytvorte obslužný program. V metóde ONRESUME () táto aktivita robí Bindservice (). Tam je jeden z parametrov, ktorý je služba rozhrania. Implementácia je aspoň rovnaká aktivita. Implementovať v nej onserviceconnected (). V tejto spätnosti sa jedným z parametrov prichádza do samotnej služby. Takže zavolajte na Sethandler () z tejto služby. Prejdite tam psovod, ktorý je v súčasnej činnosti. A tu sú prichádzajúce údaje o hodnosi UART v prevádzke na tomto obslužbe. Mimochodom, manipulátor tradične pracuje v hlavnom vlákne, takže to nebude potrebné vykonať runonuitread.
Aplikácia nie je vždy pozostávať z jednej obrazovky. Napríklad sme vytvorili veľmi užitočný program A chcem poznať používateľa, ktorý je jeho autorom. Tlačí tlačidlo "O programe" a padá nová obrazovkaKde užitočné informácie o verzii programu, autor, adresa stránky, koľko mačiek od autora atď. Vnímajte obrazovku aktivity ako webovú stránku s odkazom na inú stránku. Ak sa pozriete na kód v súbore MAINAKTIVITA.JAVA. Z minulých lekcií uvidíte, že naša trieda Hlavná činnosť. tiež odkazuje na Činnosť (alebo jeho dedičov) alebo presnejšie od neho zdedili.
MACKAKTIVITA TRIEDAUJÚCEJ TRIEDY
Ako je ľahké uhádnuť, mali by sme vytvoriť novú triedu, ktorá môže byť podobná Hlavná činnosť. A potom, keď stlačíte tlačidlo.
Pre experiment budeme mať program z prvej lekcie a použijeme tlačidlo pre experimenty (alebo vytvoriť nový projekt s jedným tlačidlom na obrazovke). Ďalej vytvorte nový formulár na zobrazenie. užitočná informácia. Napríklad ukázať užívateľa, ktorý robí mačku, keď ide doľava a vpravo. Súhlasím, že je to veľmi dôležitá informáciaDať kľúč k neoslušnému vesmíru.
Vytvoriť novú aktivitu bude manuálne, aj keď v štúdiu pripravené šablóny. Ale nie je nič komplikované a pre lepšie pochopenie je užitočné urobiť všetko s rukami.
Vytvorte nový súbor XML Markup aktivity_about.xml v priečinku res / layout.. Kliknite pravým tlačidlom myši na priečinok rozloženie. a vyberte z kontextového menu NOVÉ | Súbor zdrojov.. Zobrazí sa dialógové okno. V prvom poli Zadajte názov súboru aktivita_about. V druhom prípade musíte zadať koreňový prvok. Predvolené stojany Obmedzenie.. Umyjeme text a zadajte ScrollView.. Vstupné viac znakov je dosť pre štúdio na navrhovanie pripravených možností, môžete okamžite stlačiť ENTER, bez toho, aby ste čakali na slovo Full Input:
Ukazuje sa, že zodpovedajúcu billku, v ktorej prvok vloží TextView..
Informácie budú odstránené zo zdrojov, a to z reťazového zdroja. o. Teraz je zdôraznené červenou, signalizáciou o absencii informácií. Bolo možné kliknúť Alt + enter. A zadajte text v dialógovom okne. Ale pre náš príklad táto metóda nebude vyhovovať, pretože náš text bude multiplay, pomocou ovládacích znakov. Preto postupujte iným spôsobom. Otvorený súbor. res / Hodnoty / struny.xml A zadajte nasledujúci text manuálne:
Použili sme najjednoduchšie tagy formátovania formátovania HTML typu , , . Pre náš príklad je stačí zdôrazniť mastné slová, ktoré patria k mačke a smer pohybu. Prenos textu nový reťazec Použite symboly N.. Pridajte ďalší prostriedok reťazca pre hlavičku novej obrazovky:
Prišiel pri postúpení. Ďalej musíte vytvoriť triedu pre okno Oaktivity.java.. Vyberte v menu Súbor | NOVÉ | Trieda Java. a naplňte správne polia. Najprv stačí špecifikovať iba názov. Potom katastrofa s inými poliami.
Dostaneme obrobok.
Trieda je teraz takmer prázdna. Pridajte kód manuálne. Trieda musí byť zdedená z abstraktnej triedy Činnosť alebo jeho príbuzní Fragmentátivity., Appcompatactivity. atď. Skončiť rozširuje aktivitu.. Trieda aktivity by mala mať metódu oncreate (). Vložíme kurzor myši do triedy a vyberte v ponuke Kód | Metódy. (CTRL + O). V dialógovom okne hľadáme požadovanú triedu, môžete vytočiť prvé znaky, aby ste mohli rýchlo vyhľadávať na klávesnici. V vytvorenej metóde musíte zavolať metódu sETCONTENTVIEW ()ktorý naloží pripravenú značku na obrazovke. Túto možnosť budeme mať.
Balenie ru.alexanderklimov.Helloworld; Import Android.App.Activity; Import android.os.bundle; / ** * Vytvorené Alexandrom Klimov dňa 01.12.2014. * / Trieda triedy verejnosti rozširuje aktivitu (SavedInstancestate); SetcontentView
Teraz začína najdôležitejšia vec. Našou úlohou je prejsť na novú obrazovku, keď kliknete na tlačidlo na prvej obrazovke. Vráťte sa do triedy Hlavná činnosť.. Píšeme Kliknite na položku Manipulácia s počítačom:
Public Void Onclick (Malantivity.This, OrmaseActivity.Class); StarterActivity (zámer);)
Tu som použil spôsob, ako manipulovať s tlačidlom, o ktorom bolo povedané v triede.
Ak chcete spustiť novú obrazovku, musíte vytvoriť inštanciu triedy. Zámeru. a špecifikujte aktuálnu triedu v prvom parametri av druhej triede pre prechod, máme to Araktivita. Potom sa nazýva metóda startactivity ()ktorý spúšťa novú obrazovku.
Ak sa teraz pokúsite skontrolovať prevádzku aplikácie v emulátore, zobrazí sa chybové hlásenie. Čo sme urobili zle? Zmeškali sme jeden dôležitý krok. Je potrebné zaregistrovať nové Činnosť V manifeste AndroidManifest.xml.. Nájdite tento súbor do projektu a dvakrát kliknite na ňu. Otvorí sa okno úpravy súborov. Pridať nová značka
Takže zdroj reťazca bol užitočný. about_title.. Spustite aplikáciu, kliknite na tlačidlo a získajte okno O programe. Takže sme sa naučili, ako vytvoriť nové okno a zavolajte ho na tlačidlo. A našej likvidácii sa objavil megaudarobal - teraz tam bude vždy náznak, ktorý robí mačku, keď ide doľava.
Znova sa pozerám, že druhá vytvorená trieda činnosti by mala byť zdedená z triedy Činnosť alebo ho LISTACTIVITA. atď.), Majte XML Markups súbor (ak je to potrebné) a byť registrovaný v zjavtení.
Po volaní metódy startactivity () Začala sa nová činnosť (v tomto prípade Araktivita), Bude viditeľný a presunie sa do hornej časti zásobníka obsahujúcej pracovné komponenty. Pri volaní metódy sKONČIŤ () Novej aktivity (alebo keď stlačíte kľúčový hardvérový kľúč), bude zatvorený a odstránený z zásobníka. Developer sa môže tiež presunúť na predchádzajúcu (alebo akúkoľvek inú) aktivitu pomocou rovnakej metódy startactivity ().
Vytvorte tretiu obrazovku - spôsob, ako lenivý
Programátori, ako sú mačky, sú lenivé tvory. Neustále si pamätajte, že pre aktivitu potrebujete vytvoriť značku a triedu, ktorá je zdedená ČinnosťA potom nezabudnite zaregistrovať triedu v manifeste - áno, nafig.
V tomto prípade vyberte v ponuke Súbor | NOVÉ | Činnosť | Základná činnosť (alebo iná šablóna). Ďalej sa objaví známe okno na vytvorenie novej aktivity. Vyplňte potrebné polia.
Kliknite na tlačidlo SKONČIŤ A aktivita bude pripravená. Uistite sa, že otvorte zjavný súbor a skontrolujte dostupnosť. nové nahrávanie. Už nehovorím o súboroch triedy a značky, objavia sa pred vami.
Sám tlačidlo Na hlavnej obrazovke aktivity a napíšte kód pre prechod na vytvorenú činnosť.
Spočiatku by som vám poradil, aby ste manuálne vytvorili všetky potrebné komponenty pre novú aktivitu, aby ste pochopili vzťah medzi triedou, značkou a manifestom. A keď máte ruku, môžete použiť sprievodcu vytvorením aktivity na urýchlenie práce.
Prenos údajov medzi činnosťami
Použili sme najjednoduchší príklad Zavolať inú obrazovku aktivity. Niekedy je potrebné nielen zavolať na novú obrazovku, ale aj na to. Napríklad používateľské meno. V tomto prípade musíte použiť špeciálnu oblasť extradata.ktorý je k dispozícii v triede Zámeru..
Región extradata. - Toto je zoznam párov kľúč / hodnotaktorý sa prenáša spolu so zámerom. Riadky sa používajú ako tlačidlá, a pre hodnoty, ktoré môžete použiť akékoľvek primitívne typy dát, primitívne polia, objekty triedy Zväzok. a atď.
Pre prenos dát na inú metódu aktivít sa používa pulectra ():
Intent.putExtra ("kľúč", "hodnota");
Činnosť by mala spôsobiť určitú vhodnú metódu: getintextra (), getstringextra () atď.:
Int počet \u003d getintent (). Getintextra ("názov", 0);
Predchádzajúci príklad remajeme. Už máme tri aktivity. Pri prvej aktivite budú umiestnené dve textové polia a tlačidlo. Vzhľad Môže byť nasledovná:
V druhej aktivite DOPOČNOSŤ. Inštalačný prvok TextView.Kde budeme zobraziť text získaný z prvej aktivity. Píšeme nasledujúci kód pre metódu oncreate () V druhej činnosti.
@Override chránený prázdninový oncreate (balík Savedinstancestate) (super.oncreate (SavedInstancestate); SetcontentView (R.LAYOUT.Aktivity_second); String User \u003d "Zhyvotnyh"; String Gift \u003d "Donut Hole"; TextViewBexById (R .Id.textViewInfo); InfotextView.settext (User + ", bol odoslaný" + darček);)
Ak teraz spustíte program a jednoducho zavolajte druhé okno, ako je opísané v prvej časti článku, uvidíme predvolený nápis Zllzl, prešli ste otvor z bagelu. Súhlasím, je to dosť urážlivé prijímať takéto správy.
Opravím situáciu. Pridajte kód z prvej aktivity:
Public Void OnClick (Zobraziť zobrazenie) (Edittext Useredittext \u003d (Edittext) FindViewById (R.id.edittextuser); Edittext GiftEdittedittext \u003d (Edittext) FindViewById (R.id.edittextGift); Intent Zamestník \u003d Nový zámer (MACEACTIVITA. Trieda); // V kľúčovom mevete, budete pihem text z prvého textového poľa Intent.putExtra ("Username", userdittext.getText (). Intent.putExtra ("darček", gituredittedittext.gettext (). Tostring ()); Startactivity (zámer);)
Umiestnili sme v špeciálnom kontajneri objektov Zámeru. Dva tlačidlá s hodnotami, ktoré sú prevzaté z textových polí. Keď užívateľ zadá údaje do textových polí, spadnú do tejto kontajnera a budú prevedené na druhú činnosť.
Druhá aktivita by mala byť pripravená na teplo príjem správ nasledovne (zvýraznený tuk).
// predvolené hodnoty používateľa reťazca \u003d "žltá"; String darček \u003d "diera z bubliny"; užívateľ \u003d getintent (). GetExtras (). getstring ("užívateľské meno"); Darček \u003d getintent (). GetExtras (). Getstring ("darček"); TextView InfotextView \u003d (TextView) FindViewById (R.id.TextViewInfo); InfotextView.settext (User + ", bol si poslaný" + dar);
Teraz správa nevyzerá takto, ale aj príjemné pre niekoho. V ťažkých príkladoch je žiaduce pridať kontrolu pri spracovaní údajov. Existujú situácie, keď spustíte druhú aktivitu s prázdnym typom údajov nULOVÝČo môže viesť k kolapsu aplikácie.
V našom prípade vieme, že čakáme na hodnotu reťazca, takže kód môže byť prepísaný:
Zámerný úmysel \u003d getintent (); užívateľ \u003d intent.getstringExtra ("Username");
Užívateľ \u003d getintent (). Getstringextra ("používateľské meno");
Program má nevýhodu - nie je jasné, odkiaľ dostaneme LED. Akákoľvek dobre vychovávaná mincovňa nebude mať dar z anonymného zdroja. Preto ako domáce úlohy pridajte ďalšie textové pole na zadanie mena používateľa, ktorý posiela správu.
Spoločnosť Google odporúča používať nasledujúci formát pre tlačidlá: názov vášho balíka ako predponu a potom samotný kľúč. V tomto prípade si môžete byť istí v jedinečnosti kľúčov pri interakcii s inými aplikáciami. Približne takto:
Verejný konečný Static String User \u003d "RU.ALEXANDERKLIMOV.MYAPP.USER";
Kto dal mačku vasku - získajte výsledok späť
Nie vždy, že tieto ďalšie aktivity jednoducho sprostredkuje. Niekedy potrebujete získať informácie z inej aktivity, keď je zatvorené. Ak sme použili metódu Štartovosti (zámer)Potom je tu relatívna metóda starterAtratrotiforsult (zámerný úmysel, INTIONCODE). Rozdiel medzi metódami je dodatočný parameter Vyžiadať kód.. V skutočnosti je to len celé číslo, ktoré si môžete myslieť na seba. Je potrebné rozlišovať, od ktorého výsledok prišiel. Predpokladajme, že máte päť Ďalšie obrazovky A priradíte ich hodnoty od 1 do 5, a na tomto kóde môžete určiť, ktorého výsledok je potrebné spracovať. Môžete použiť -1, potom to bude ekvivalentné volaniu metódy startactivity (). Nebudem mať žiadny výsledok.
Ak použijete metódu starinateriforsult ()Musíte prepísať metódu v kóde na získanie výsledku onActivityResult () a spracovať výsledok. Zmätený? Zaujímajte sa o príklad.
Predpokladajme, že ste jeleň. Informácie boli prijaté, že dva kusy klobás a iné výrobky boli ukradnuté z reštaurácie z tabuľky vplyvnej osoby. Suspuge Palo na troch podozrivých - vrána, kurva mačička a mačka vaska.
Jeden z návštevníkov poskytoval sériu fotografií z jeho prášku iPhone:
Existuje aj indikácia ďalšieho svedectva: A vaska počúva, áno.
Vytvorte nový projekt Štrbina S dvoma aktivitami. Na prvej obrazovke sa na prepnutie na druhú obrazovku a textový štítok, v ktorom sa zobrazí názov zlodejov.
Na druhej obrazovke bude skupina prepínačov:
Vzhľadom k tomu, budeme očakávať odozvu z druhej obrazovky, musíme použiť metódu starinateriforsult () Na prvej obrazovke, v ktorej poskytneme premennú Vyberte si. Ako parameter Vyžiadať kód..
Statické konečné súkromné \u200b\u200bdo výberu_Thef \u003d 0; Public Void Onclick (View V) (MACACTIVITY.THIS, CHOOSEACTIVITY.CLASS); StarterActivityForresult (notintent, odber_Thief);)
Pozrite sa na kód. Keď kliknete na tlačidlo, budeme pracovať s druhou obrazovkou Chooseaktivity. A spustite druhú obrazovku s očakávaním výsledku.
Prejdite na druhú obrazovku a napíšte kód pre druhú aktivitu.
Verejný záverečný statický zlodej reťazca \u003d "ru.alexanderklimov.sherlock.Thef"; Public Void OnradiOClick (Zobraziť V) (zámer odpovedíTintent \u003d nový zámer (); prepínač (V.GetId ()) (Prípad R.id.Radiodog: OdpoveďINTENT.puTextra (zlodej, "Fucking Pussy"); Break; Case R.ID .RadiOrcowow: odpoveďInTextra (zlodej, "vrana"); prestávka; case r.id.Radiocat: respondent.ppustExtra (zlodej, "przevalský kôň"); prestávka; predvolené: prestávka;) setresult (výsledok_OK, odpovedí); ();)
Tu všetko je jednoduché, keď detektív vyberie meno zločinu, potom prostredníctvom metódy pulectra () Prejdeme k kľúčovému menu a jeho hodnotu.
Pre pohodlie, po výbere, okamžite zatvoríme druhé okno a prenášame hodnotu pred zatvorením. Výsledok_OK.Takže bolo jasné, že výber je vytvorený. Ak používateľ zatvorí obrazovku cez tlačidlo Späť, potom bude hodnota prenášaná Výsledok_canceled..
Metóda sETRESULT () Trvá dva parametre: výsledný kód a samotný výsledok prezentovaný vo forme zámeru. Výsledný kódex naznačuje, aký výsledok ukončil činnosť činnosti, spravidla je Aktivita.Result_OK.buď Aktivity.Result_canceled.. V niektorých prípadoch musíte použiť vlastný kód náhrady na spracovanie špecifických možností pre vaše možnosti aplikácií. Metóda sETRESULT () Podporuje celú hodnotu.
Ak údaje prenášate jasne cez tlačidlo, bolo by pekné pridať metódu sKONČIŤ ()Uzavrieť druhú aktivitu ako zbytočnú. Ak sa prechod vyskytne cez tlačidlo Späť, nie je potrebné to urobiť.
Ak je aktivita zatvorená užívateľom, keď je stlačené tlačidlo vrátenia hardvéru, alebo ak je metóda sKONČIŤ () bol spôsobený skôr ako metóda sETRESULT ()Výsledný kód bude inštalovaný v Výsledok_canceled.a návrat zámeru zobrazí hodnotu nULOVÝ.
Návrat na prvú obrazovku. Prvá obrazovka čaká na odpoveď z druhej obrazovky, takže musíte pridať do kódovej metódy onActivityResult ().
@Override chránený prázdnota ONACTIVITYRESUTULT (INT PRIPOŽSTANOKOĽVEK PRÍPRAVA, INT FACTCODE, INTERTOVÉ DATA) (super.ONAktivitaResult (požiadavkaCODE, výsledok, dáta); TextViewMexById (R.id.TexietViewInfo); ak (požiadavkaCODE \u003d\u003d SEARKVIEW) Ak (výsledok \u003d\u003d výsledok_OK) (strun thefiefname \u003d data.getstringExtra (chooseActivity.Thef); infotextview.settext (thefiefname);) inak (InfotextView.settext ("); // Vymažeme text)))
Metóda očakáva prichádzajúce údaje s kódom. Vyberte si.a ak sa takéto údaje prídu, potom získava hodnotu z tlačidla Chooseaktivity.Thef Použitie metódy getstringextra. Získaná hodnota, v ktorej získame TextView. (Premenná infotextView.). Ak sme sa vrátili na obrazovku cez tlačidlo Späť, potom jednoducho vymažte text.
Pri zatvorení dcérskej spoločnosti vnútri rodičovskej zložky sa psovod spustí onActivityResult (). Psovod onActivityResult () Trvá niekoľko parametrov.
- Vyžiadať kód. Kód, ktorý sa použil na začatie činnosti, ktorá vracia výsledok
- Kód výsledku. Kód výsledku stanovený dcérskou spoločnosťou a uvádzajúc, ako jeho práca skončila. Môže to byť celá hodnota, ale spravidla Aktivita.Result_OK.buď Aktivity.Result_canceled.
- Údajov. Zámer používaný na balenie vrátených údajov. V závislosti od účelu dcérskej aktivity môže zahŕňať cestu URI, ktorá predstavuje vybranú časť obsahu. Prípadne (alebo doplnky) môže dcérska spoločnosť vrátiť informácie vo forme jednoduchých hodnôt balených v zámernom parametri doplnky.
Ak práca dcérskej činnosti skončila nepredvídaným, alebo ak výsledok kód nebol špecifikovaný pred zatvorením, tento parameter sa rovná Aktivity.Result_canceled..
Spustite projekt, kliknite na tlačidlo a prejdite na druhú obrazovku. Vyberieme jednu z možností. Ak vyberiete kroky, obrazovka sa zatvorí a na prvej obrazovke sa zobrazí názov kriminality. Ak si vyberiete snack, zobrazí sa jeho názov.
Mimochodom, ak si vyberiete mačku, potom sa jeho meno nezobrazí! Skontrolujte a pozrite sa na seba. Pýtate sa prečo? Elementary Watson! Trestný nepovažoval jeden dôležitý detail. Reštaurácia bola pozorovaná z kamkordéra a záznam ukázal, kto skutočne ukradol klobásu a nahradil mačku. Vaska, držať sa!
P.S. Ak sa najprv zdalo nezrozumiteľné, potom oveľa jasnejšie. Prenos dát medzi obrazovkami sa často nachádza v aplikáciách a nebudete čítať príklad viac ako raz.
P.p.s. Najlepšie ryby - klobása. Poznať túto slabosť, nebolo ťažké nahradiť mačku.
Použite filtre
V článku som ukázal spoločný spôsob prechodu na inú činnosť, keď v tejto metóde startactivity () Zobrazí sa aktuálna trieda a trieda pre spínanie. Mimochodom, trieda činnosti nemusí byť súčasťou vašej žiadosti. Ak poznáte názov triedy z inej aplikácie, môžete ísť k nej. Ale môžete ísť do inej činnosti iným spôsobom.
V praxi sa stretáva menej často, ale môže prísť šikovné. Predpokladajme, že už máte druhú aktivitu. V manifestu pridajte k nemu špeciálny filter:
A spustite druhú aktivitu pomocou tlačidla týmto spôsobom.
Public Void Onclick (Nový zámer) (RU.ALEXANDERKLIMOV.TESTAPPLIKÁCIA.secondaActivity ");)
Nahradiť dlhý reťazec Na konštante.
Public Static Final String Action_second_Activity \u003d "ru.alexanderklimov.testapplication.secondActivity"; Public Void Onclick (Nový zámer (Action_second_Activity);)
Takže to, čo sme urobili. Pre druhú aktivitu sme predpísali filter a uviedli názov akcie. V atribúte android: Meno.. Pre pohodlie som jednoducho umiestnil celé meno aktivity s názvom balíka. Designer triedy Zámeru. Má niekoľko preťažených verzií. V jednej z verzií môžete zadať reťazec pre akciu. Uviedli sme naše vytvorené akcie, ktoré je napísané v druhej činnosti. Systém pri práci s prehľadávaním prejavov všetkých nainštalované aplikácie. Pri hľadaní súladu systém nájde náš filter a spustí požadovanú aktivitu.
Rovnakým princípom možno spustiť iné činnosti. Pozrite sa na príklad. Ak skopírujete príklad pre seba a pozrite sa na dokumentáciu android.provider.settings.Action_airplan_mode_settings.Uvidíte, že konštanta reťazca zodpovedá tomuto kódexu. public Static Final Java.Lang.string Action_airplan_mode_settings \u003d "android.settings.Airplane_mode_settings". Porovnajte s naším kódom. Môžete predpokladať, že aktivita nastavení pre autonómny režim Tento reťazec je predpísaný vo filtri.
Názov kategórie filtra android.intent.category.Default. Hovorí systém, ktorý by sa mal vykonať predvolené akcie, menovite činnosť. Existujú aj iné mená, ktoré sa o nás nezaujímajú.
A teraz je otázka na zásielku. Čo sa stane, ak vytvoríte inú aktivitu a zadajte rovnaký filter ako druhá aktivita? A skontrolujme. Vytvorte tretiu aktivitu a skopírujte blok s filtrom z druhej aktivity do nej.
Kliknite na tlačidlo v prvej aktivite. Systém vás požiada o výber požadovanej možnosti.
Ak vyberiete Vždy, nabudúce si nemusíte vybrať. Ak chcete obnoviť výber, prejdite na vlastnosti aplikácie v nastaveniach a vyhľadajte tlačidlo. Jasné predvolené hodnoty..
Spustenie aktivity podľa jeho mena
V dizajníri Zámeru. Druhý parameter je trieda. Predpokladajme, že existuje nejaká databáza, kde sú uvedené mená činností a musíme spustiť potrebnú činnosť podľa svojho mena. Môžeme na základe premennej reťazcov, aby sme získali samotnú triedu a prevádzkuje aktivitu.
Skúste (// Úplný názov triedy činností String ActivityName \u003d "RU.ALEXANDERKLIMOV.TESTAPPLIKÁCIA.SECONDACTIVITY"; // Dostaňte objekt triedy triedy> Myclass \u003d class.forname (ActivityName); Zámerový úmysel \u003d nový zámer (tento, myclass); Startactivity (zámer); ) Úlovok (ClassnotfoundException e) (E.printstacktrace ();)