Prijenos podataka između aktivata. Prebacite između aplikacijskih zaslona. Tko je stavio mačku Vašku - vratite rezultat natrag
Aplikacija se ne sastoji uvijek od jednog zaslona. Na primjer, stvorili smo vrlo koristan program i korisnik želi znati tko je njegov autor. On pritisne gumb "o programu" i pada na novi zaslon, gdje korisne informacije o verziji programa, autor, adresu stranice, koliko mačaka i tako dalje. Vizite zaslon aktivnosti kao web-stranicu s vezom na drugu stranicu. Ako pogledate kod u datoteci Mainactivity.java. Iz prošlosti lekcije vidjet ćete da je naš razred Glavna aktivnost. također se odnosi na Aktivnost (ili njegovi nasljednici) ili, preciznije, naslijeđeni od njega.
Voditeljica javne klase proširuje appcompatactivity
Kako je lako pogoditi, trebamo stvoriti novi razred, koji može biti sličan Glavna aktivnost. I onda nekako prebacite na njega kada pritisnete gumb.
Za eksperiment ćemo uzeti program iz prve lekcije i koristiti gumb za eksperimente (ili stvoriti novi projekt s jednim gumbom na zaslonu). Zatim stvorite novi obrazac za prikaz korisnih informacija. Na primjer, pokažite korisniku koji izrađuje mačku kada ide lijevo i desno. Slažem se, to su vrlo važne informacije koje daje ključ za negnaciju svemira.
Ručno ćemo stvoriti novu aktivnost, iako u studiju postoje gotovi uzorci. Ali ne postoji ništa komplicirano i za bolje razumijevanje je korisno učiniti sve s vašim rukama.
Stvorite novu XML oznaku datoteku activity_About.xml u mapi res / izgled., Desnom tipkom miša kliknite mapu izgleda. i odaberite iz kontekstnog izbornika Novo | Datoteka resursa izgleda., Pojavljuje se dijaloški okvir. U prvom polju unesite naziv datoteke aktivnost_About, U drugom, morate ući u korijenski element. Zadano stoji Ograničenje., Peremo tekst i unesite ScrollView., Unos više znakova je dovoljno da studio predloži gotove opcije, možete odmah pritisnuti Enter, bez čekanja riječi puni ulaz:
Ispada odgovarajući lilter u kojem će element umetnuti TextView..
Informacije će biti uklonjene iz resursa, naime iz niza resursa. o_text, Sada je označeno crvenom bojom, signaliziranje o odsutnosti informacija. Bilo je moguće kliknuti Alt + Enter. I unesite tekst u dijaloškom okviru. Ali za naš primjer, ova metoda neće odgovarati, budući da će naš tekst biti multiplay, koristeći kontrolne znakove. Stoga nastavite na drugačiji način. Otvorena datoteka res / vrijednosti / strings.xml I ručno unesite sljedeći tekst:
Koristili smo najjednostavnije oznake za oblikovanje teksta HTML-a , , , Za naš primjer, dovoljno je istaknuti masne riječi koje pripadaju mačji i smjeru kretanja. Za prijenos teksta na novi niz, koristite znakove N., Dodajte drugi izvor izvora za zaglavlje novog zaslona:
Oznaka je shvatila. Zatim trebate stvoriti razred za prozor Oguhavost.java., Odaberite u izborniku Datoteka | Novo | Java klasa. i ispunite desna polja. U početku, dovoljno je odrediti samo ime. Zatim katastrofa s drugim poljima.
Dobivamo radni komad.
Sada je razred gotovo prazan. Dodajte kôd ručno. Klasa mora biti naslijeđena od apstraktne klase Aktivnost ili njegovi rođaci Fragmentaktivnost., Appadpataktivnost itd Završi proširuje aktivnost., Klasa aktivnosti trebala bi imati metodu podcreate (), Stavili smo pokazivač miša unutar razreda i odaberite u izborniku Koda | Nadjačati metode. (Ctrl + O). U dijaloškom okviru tražimo željenu klasu, možete birati prve znakove za brzo pretraživanje na tipkovnici. U stvorenoj metodi morate nazvati metodu setconntentView ()koji će učitati pripremljenu oznaku na zaslonu. Imat ćemo ovu opciju.
Paket ru.Alexanderklimov.Hollorld; Uvoz android.app.agitivity; Uvoz android.os.bundle; / ** * stvorio Alexander Klimov na 01.12.2014. * / Javna klasa oštrica proširuje aktivnost (savedstancestat); SETConntentView (r.layouut.activity_about);)))
Sada počinje najvažnija stvar. Naš zadatak je da ide na novi zaslon kada kliknete gumb na prvom zaslonu. Vratite se na razred Glavna aktivnost., Pišemo klik klik kliknite Rukovatelj:
Javna prazna OnClick (Malavnost.This, Ayactivity.class); Startactivity (namjera);)
Ovdje sam koristio način da se nosima s pritiskom na koji je rečeno u razredu.
Da biste započeli novi zaslon, morate stvoriti instancu klase. Namjera i navedite trenutni razred u prvom parameru, au drugom - klasu za tranziciju, imamo ga Okovanost, Nakon toga se naziva metoda startActivity ()koji pokreće novi zaslon.
Ako sada pokušate provjeriti rad aplikacije u emulatoru, primit ćete poruku o pogrešci. Što smo učinili krivo? Propustili smo jedan važan korak. Trebate registrirati novo Aktivnost Manifesta Androidmanifest.xml., Pronađite ovu datoteku u svom projektu i kliknite na nju dvaput. Otvara se prozor za uređivanje datoteka. Dodajte novu oznaku
Tako je resurs string bio koristan. o_title, Pokrenite aplikaciju, kliknite na gumb i uzmi prozor O programu, Tako smo naučili kako stvoriti novi prozor i nazvati ga da kliknete gumb. I na raspolaganju se na raspolaganju Megaudobalni program - sada će uvijek biti nagovještaj, što čini mačku kada ostane lijevo.
Ponovno gledam da je druga stvorena klasa aktivnosti trebala biti naslijeđena od razreda Aktivnost ili ga kao ( Popis. itd.), imaju XML oznaku datoteke (ako je potrebno) i biti registriran u manifestu.
Nakon pozivanja metode startActivity () Nova aktivnost će biti lansirana (u ovom slučaju Okovanost), bit će vidljivo i pomiče se na vrh stog koji sadrži radne komponente. Prilikom pozivanja metode zAVRŠI () Nove aktivnosti (ili kada pritisnete povratni hardverski ključ), bit će zatvoreno i uklonjeno iz stog. Developer se također može premjestiti na prethodnu (ili na bilo koju drugu) aktivnost koristeći istu metodu startActivity ().
Stvoriti treći zaslon - način lijenog
Programeri, poput mačaka, su lijena stvorenja. Stalno se sjećam da je za aktivnost koju trebate stvoriti oznaku i klasu koja je naslijeđena Aktivnost, A onda ne zaboravite registrirati razred u manifestu - da, Nafig.
U tom slučaju odaberite u izborniku Datoteka | Novo | Aktivnost | Osnovna aktivnost (ili drugi predložak). Nadalje, pojavit će se poznati prozor za stvaranje nove aktivnosti. Popunite potrebna polja.
Kliknite na gumb ZAVRŠI. I aktivnost će biti spremna. Da biste bili sigurni da, otvorite manifest datoteku i provjerite dostupnost novog unosa. Više ne kažem o spisima razreda i označavanja, oni će se pojaviti ispred vas.
Sam Dodajte novi gumb na glavnom zaslonu aktivnosti i napišite kôd za prijelaz na stvorenu aktivnost.
Isprva bih vam savjetovao da ručno stvorite sve potrebne komponente za novu aktivnost da biste razumjeli odnos između razreda, označavanja i manifesta. A kada imate ruku, možete koristiti čarobnjak za stvaranje aktivnosti kako biste ubrzali rad.
Prijenos podataka između aktivnosti
Koristili smo najjednostavniji primjer za nazivanje drugog zaslona aktivnosti. Ponekad je potrebno ne samo da biste nazvali novi zaslon, već i prijenos podataka. Na primjer, korisničko ime. U tom slučaju morate koristiti posebno područje extradata.koji je dostupan u razredu Namjera.
Regija extradata. - Ovo je popis parova ključ / vrijednostkoji se prenosi zajedno s namjerom. Linije se koriste kao ključevi, a za vrijednosti koje možete koristiti primitivne vrste podataka, primitivnih polja, klase objekata Paket. i tako dalje.
Za prijenos podataka koristi se metoda druge aktivnosti putextra ():
Namjera.PutExtra ("ključ", "vrijednost");
Uzimanje aktivnosti trebala bi uzrokovati prikladnu metodu: getintextra (), gettstruingextra () itd.:
Int count \u003d gettent (). GetIntextra ("ime", 0);
Pomažemo prethodni primjer. Već imamo tri aktivnosti. Na prvoj aktivnosti bit će postavljena dva teksta i gumb. Izgled može biti sljedeći:
U drugoj aktivnosti Sredstva. Element za ugradnju TextView.gdje ćemo prikazati tekst dobiven iz prve aktivnosti. Pišemo sljedeći kod za metodu podcreate () U drugoj aktivnosti.
@OERRIDE zaštićeno praznina (paket savedinstancestate) (super.oncreat (savedinstancestat); SETConntentView (r.layouut.activity_second); string korisnik \u003d "Zhyvotnyh"; string dar \u003d "Donut Hole"; TextView InfoTextView \u003d (TextView) FindViewByid (r .Id.Textviewinfo); InfoTextView.setsetxt (korisnik + ", bili ste poslani" + dar);)
Ako sada pokrenete program i jednostavno nazovite drugi prozor, kao što je opisano u prvom dijelu članka, vidjet ćemo zadani natpis Žuto, prolazili ste rupu iz peciva, Slažem se, to je prilično uvredljivo za primanje takvih poruka.
Popravim situaciju. Dodaj kod iz prve aktivnosti:
Javno void Onclick (Prikaz View) (Edittext UseDeritsetEt \u003d (EditText) FindViewByid (r.id.editteextext); edittext giftenettext \u003d (edittext) feindviewbiid (r.id.edittextgift); namjerna namjera \u003d nova namjera (maILactivity.this, sentraktivnost. Klasa); // U korisničkom imenu tipku, vi ćete PIHEM tekst iz prvog tekstualnog polja Intent.PutExtra ("Korisničko ime", UserditText.getText (). Tostring ()); // b Key Poklon Piham Tekst iz drugog teksta Intent.PutExtra ("Poklon", giftenettexext.gettext (). Tostring ()); potaknuta (namjera);)
Stavili smo u posebni objekt spremnik Namjera Dvije tipke s vrijednostima koje se uzimaju iz tekstualnih polja. Kada korisnik uđe u podatke u tekstualne polja, oni će pasti u ovaj spremnik i bit će preneseni na drugu aktivnost.
Druga aktivnost trebala bi biti spremna za topli prijem poruka na sljedeći način (označena masnoća).
// default vrijednosti string korisnik \u003d "žuta"; Gudački dar \u003d "rupa iz mjehurića"; korisnik \u003d getIntent (). GetExtras (). Getstring ("korisničko ime"); Dar \u003d gettent (). GetExtras (). Getstring ("dar"); TextView InfoTextView \u003d (TextView) FindViewbid (r.id.textviewinfo); InfoTextView.settext (korisnik + ", bili ste poslani" + dar);
Sada poruka ne izgleda ovako, ali čak i ugodno za nekoga. U teškim primjerima, poželjno je dodati ček pri obradi podataka. Postoje situacije kada pokrenete drugu aktivnost s praznim tipom podataka nulaŠto može dovesti do kolapsa aplikacije.
U našem slučaju, znamo da čekamo nizovnu vrijednost, tako da se kod može prepisati:
Namjerna namjera \u003d gettent (); korisnik \u003d intenter.getstringextra ("korisničko ime");
Korisnik \u003d getIntent (). Getstruingextra ("korisničko ime");
Program ima nedostatak - nije jasno od koga dobivamo. Svaka dobro odgojna ment neće uzeti dar od anonimnog izvora. Stoga, kao domaća zadaća, dodajte drugi tekstni okvir za unos imena korisnika koji šalje poruku.
Google preporučuje korištenje sljedećeg formata za ključeve: naziv vašeg paketa kao prefiks, a zatim i sam ključ. U tom slučaju, možete biti sigurni u jedinstvenost ključa prilikom interakcije s drugim aplikacijama. Cca ovako:
Javni konačni statički string korisnik \u003d "ru.Alexanderklimov.myapp.user";
Tko je stavio mačku Vašku - vratite rezultat natrag
Ne događa se uvijek jednostavno prenijeti ove druge aktivnosti. Ponekad morate dobiti informacije iz druge aktivnosti kada je zatvorena. Ako smo koristili metodu staravljenje (namjera namjere)Zatim postoji relativna metoda startematiforresult (namjera namjere, int zahtjev kvoda), Razlika između metoda je dodatni parametar Zahtjev., Zapravo, to je samo cijeli broj koji možete sjetiti sebe. Potrebno je kako bi se razlikovao od koga je rezultat došao. Pretpostavimo da imate pet dodatnih zaslona i dodjeljujete vrijednosti od 1 do 5, a na ovom kodu možete odrediti čiji rezultat trebate obraditi. Možete koristiti -1, a zatim će biti ekvivalentni metodom startActivity (), Neću dobiti nikakav rezultat.
Ako koristite metodu startnometriford ()Morate poništiti metodu u kodu za primanje rezultata onactivityresult () i obraditi rezultat. Zbunjeni? Pitamo se primjer.
Pretpostavimo da ste jelen. Informacije su primljene da su dva komada kobasica i drugih proizvoda ukradena iz restorana iz tablice utjecajne osobe. Balsusage Palo na tri osumnjičenika - vrana, jebena maca i mačka Vaska.
Jedan od posjetitelja pružio je niz fotografija iz svog praha iPhonea:
Tu je i naznaka drugog svjedoka: I Vaska sluša, da jede.
Stvoriti novi projekt Sherlock S dvije aktivnosti. Na prvom zaslonu bit će gumb za prebacivanje na drugi zaslon i naljepnicu teksta u kojoj će se prikazati ime lopova.
Na drugom zaslonu bit će grupa prekidača:
Budući da ćemo očekivati \u200b\u200bodgovor na drugom zaslonu, moramo koristiti metodu startnometriford () Na prvom zaslonu u kojem ćemo dati varijablu Odabir_thief. kao parametar Zahtjev..
Statički konačni privatni u izbor_thief \u003d 0; Javna praznina (View v) (Mainactivity.This, Chooseactivity.class); StarTivityForresult (ispitivanje, odabir);)
Pogledajte kod. Kada kliknete na gumb, mi ćemo raditi s drugim zaslonom Izbor. I pokrenite drugi zaslon s očekivanjem rezultata.
Idite na drugi zaslon i napit ćete kod za drugu aktivnost.
Javni konačni statički string lopov \u003d "ru.alexanderklimov.sherlock.thief"; Javna prazna ONRADIOCLICK (View v) (Namjera odgovornost \u003d Nova namjera (); prekidač (v.getId ()) (slučaj r.id.Radiodog: Anssettens.putExtra (lopov, "jebeno maca"); .Radiocrow: Anssextra (lopov, "vrana"); pauza; slučaj r.id.Radiocat: Anssettens.putExtra (lopov, "PRZhevalsky's"); pauza; default: pauza;) ();)
Ovdje je sve jednostavno kada detektiv odabere ime kriminala, a zatim kroz metodu putextra () Prolazimo ključno ime i njegovu vrijednost.
Za praktičnost, nakon odabira odmah zatvorimo drugi prozor i prenosimo vrijednost prije zatvaranja. Rezultat_ok.tako da je bilo jasno da je izbor napravljen. Ako korisnik zatvori zaslon preko gumba za leđa, vrijednost će se prenijeti Rezultat_canced..
Metoda setresult () Uzima dva parametra: rezultirajući kod i sam rezultat prikazani u obliku namjere. Dobiveni kod sugerira što je rezultat okončao rad aktivnosti, u pravilu Aktivnosti.Result_ok.ili Aktivnosti.Result_Canced., U nekim slučajevima, morate koristiti vlastiti kod za povrat za obradu određenih opcija za opcije aplikacije. Metoda setresult () Podržava bilo koju cijeli broj.
Ako odmah prenosite podatke putem gumba, bilo bi lijepo dodati metodu zAVRŠI ()Zatvoriti drugu aktivnost kao nepotrebnu. Ako se prijelaz dođe do gumba za leđa, to nije potrebno učiniti.
Ako je aktivnost zatvorena od strane korisnika kada se pritisne gumb hardvera ili ako je metoda zAVRŠI () uzrokovana je ranije od metode setresult ()Rezultirajući kod će biti instaliran u Rezultat_canced., a namjera vraćanja će pokazati vrijednost nula.
Povratak na prvi zaslon. Prvi zaslon čeka odgovor na drugom zaslonu, tako da morate dodati metodu koda onactivityresult ().
@Verride zaštićeno praznina oneactivityresultu (int zahtjev kôd, int RelationCode, namjerni podaci) (Super.onactivityResult (zahtjev za retuctcode, Relationscode, podaci); TextView InfoTextView \u003d (TextView) FindViewByID (R.ID.TextviewInfo); ako (relationscode \u003d\u003d Result_ok) (string Thiefame \u003d Data.TetstringerExtra (chooseactivity.thief); InfoTextExt.settext (ThiefName);) drugo (infotextview.settletxt ("); // Mi brisati tekst)))
Metoda očekuje dolazne podatke s kodom. Odabir_thief.i ako takve podatke stignu, dohvaća vrijednost od ključa Choseactivity.thief Korištenje metode getstrindextra, Dobivenu vrijednost koju proizlazimo u TextView. (varijabla infoTextView.). Ako smo se vratili na zaslon preko gumba Back, jednostavno izbrišite tekst.
Prilikom zatvaranja podružnice unutar roditeljske komponente, voditelj je pokrenut onactivityresult (), Rukovatelj onactivityresult () Traje nekoliko parametara.
- Zahtjev kod. Kodeks koji je korišten za pokretanje aktivnosti vraća rezultat
- Kod rezultata. Koda rezultata postavljen od strane podružnice i ukazujući na to kako je njegov rad završio. Može biti bilo koja cijela vrijednost, ali, u pravilu, bilo Aktivnosti.Result_ok.ili Aktivnosti.Result_Canced.
- Podaci. Namjeru koja se koristi za pakiranje vraćenih podataka. Ovisno o svrsi supsidijarne aktivnosti, može uključivati \u200b\u200bPut URI koji predstavlja odabrani dio sadržaja. Alternativno (ili dodaci), podružnica može vratiti podatke u obliku jednostavnih vrijednosti pakiranih u parametru namjere dodaci.
Ako se rad podružnice okončao nepredviđenim ili ako kod rezultata nije bio određen prije zatvaranja, ovaj parametar će biti jednak Aktivnosti.Result_Canced..
Pokrenite projekt, kliknite na gumb i idite na drugi zaslon. Odabiremo jednu od opcija. Ako odaberete vrane, zaslon se zatvara i naziv kaznenogje pojavit će se na prvom zaslonu. Ako odaberete snack, pojavit će se njegovo ime.
Usput, ako odaberete mačku, njegovo se ime neće pojaviti! Provjerite i uvjerite se sami. Pitat ćete zašto? Elementary Watson! Kriminalac nije smatrao važnim detaljima. Restoran je opažen iz kamkordera, a zapis je pokazao tko je zapravo ukrao kobasicu i zamijenio mačku. Vaska, drži se!
p.s. Ako se u početku činilo nerazumljivim, onda mnogo jasniji s mnogo. Prijenos podataka između zaslona se često nalazi u aplikacijama i nećete pročitati primjer više od jednom.
P.p.S. Najbolja riba - kobasica. Znajući ovu slabost, nije bilo teško zamijeniti mačku.
Koristite filtre
U članku sam pokazao zajednički način prijelaza na drugu aktivnost, kada je u metodi startActivity () Prikazana je trenutna klasa i razred za uključivanje. Usput, klasa aktivnosti ne mora biti dio vaše prijave. Ako znate ime razreda iz druge aplikacije, možete ga otići. Ali možete otići na drugu aktivnost na drugi način.
U praksi se često zadovoljava, ali može doći u ruci. Pretpostavimo da već imate drugu aktivnost. U manifestu dodajte poseban filter na njega:
I pokrenite drugu aktivnost putem gumba na ovaj način.
Javna prazna Onclick (nova namjera) (ru.Alexanderklimov.testapplication.SecondActivity ")););)
Zamijenite dugi niz u konstantu.
Javni statički konačni string action_second_activity \u003d "ru.Alexanderklimov.testapplication.SECondActivity"; Javna prazna onclick (nova namjera (akcija_second_activity);)
Što smo učinili. Za drugu aktivnost propisali smo filtar i označili ime za akcijski. U atributu android: Ime., Za praktičnost, jednostavno sam stavio puni naziv aktivnosti s imenom paketa. Dizajner klase Namjera Ima nekoliko preopterećenih verzija. U jednoj od verzija možete odrediti niti za akciju. Naveli smo naše stvorene akcije, koji je napisan u drugoj aktivnosti. Sustav tijekom rada pregledavanja manifesta svih instaliranih aplikacija. Kada tražite usklađenost, sustav pronalazi naš filtar i pokreće željenu aktivnost.
Istog načela mogu se pokrenuti i druge aktivnosti. Pogledajte primjer. Ako kopirate primjer za sebe i pogledajte dokumentaciju za android.provider.settings.action_airplane_mode_settings.Vidjet ćete da konstanta niza odgovara ovom kodu. javni statički Final Java.Lang.string Action_airPlane_mode_settings \u003d "Android.settings.abplane_mode_settings", Usporedite s našim kodom. Možete pretpostaviti da je aktivnost postavki za autonomni način rada u filtru propisao ovu liniju.
Naziv kategorije filtra android.intent.Category.default. Kaže sustav koji treba izvršiti zadanu radnju, naime, pokrenuti aktivnosti. Postoje druga imena koja nas ne zanimaju.
A sada je pitanje na zatrpavanju. Što se događa ako stvorite drugu aktivnost i navedite isti filtar kao i druga aktivnost? I provjerimo. Stvorite treću aktivnost i kopirajte blok s filtrom iz druge aktivnosti u nju.
Kliknite na gumb u prvoj aktivnosti. Sustav će vas zamoliti da odaberete željenu opciju.
Ako odaberete Stalno, sljedeći put kada ne morate odabrati. Da biste resetirali odabir, idite na svojstva aplikacije u postavke i pronađite gumb. Jasne zadane postavke..
Trčanje aktivnosti po njegovom imenu
U dizajneru Namjera Drugi parametar je klasa. Ali pretpostavimo da postoji neka vrsta baze podataka, gdje su naznačene imena aktivnosti i moramo voditi potrebnu aktivnost po imenu. Možemo na temelju gudačke varijable da biste dobili samu klasu i pokrenuli aktivnosti.
Pokušajte (// puni naziv klase aktivnosti aktivnosti aktivnosti \u003d "ru.alexanderklimov.testapplication.SECondActivity"; // Primite objekt klase klase> Myclass \u003d class.forname (aktivnome); Namjerna namjera \u003d nova namjera (ovo, myclass); Potaknut (namjera); ) Ulov (classnotfoundException e) (e.printstacktrace ();)
Nekako sam imao zadatak prenijeti podatke iz usluge na aktivatu. Počela je potraga za rješenjima u standardnom SDK-u, ali budući da nije bilo vremena, onda je letjelo loše rješenje kao korištenje baze podataka. No, pitanje je otvoreno i nakon nekog vremena shvatio sam s točnijim putem, koji je u SDK - koristeći nastavu poruke, rukovatelj, glasnik.
Ideja
Moramo prenositi podatke od aktiviranja na servis i natrag. Kako ćemo to učiniti? Da bismo riješili naš zadatak, već imamo sve što vam je potrebno. Sve što trebate je vezati uslugu na atetitivnost koristeći vendservice, prenijeti željene parametre i malo magije u obliku korištenja predavanja poruka. A Magic je koristiti varijable instance poruka i posebno odgovoriti. Ova varijabla je potrebna za nas, tako da se možemo odnositi na instancu menžerne usluge od aktivnih i u službi do Mesprašci-kopija. Zapravo, ne tako jednostavno. Barem za moj ne najudačniji um. U dijelu, jednostavno poboljšavam dokumentaciju koja je već - usluge također, postoji dobar primjer na stackoverflow. U svakom slučaju, nadam se da će članak biti koristan barem netko i nisam se usudio uzalud.
Primjer
Kao primjer, implementiramo uslugu koja će se povećati i smanjiti vrijednost brojača i vratiti rezultat u Aktivnosti u Textview. Broj izgleda je izostavljen, jer postoje dva gumba i tekstualne polje - sve je jednostavno.
Prodajni
Dat ću potpuno aktivirati kod:
Voditeljica javne klase proširuje aktivnost (javna statička konačna tag \u003d "testservice"; testserviceConnection testservconn; Testview testtxt; Final Messenger Messenger \u003d Novi Messenger (novi INCOMINGHINDER ()); Messenger ToServikeEmessenger; @OVERRID Podscraate (savedstancestat); SETConntentView; testttxtxt \u003d (TextView) FindViewByID (r.id.test_txt); Binderice (nova namjera), (testservconn \u003d novi testserviceConnection ()), kontekst .bind_auto_create);) @ super.Edestroy (); undendservice (testservconnn);) javna prazna koentincrclick (tipka za prikaz) (, testservice.count_plus); msg.replyto \u003d glasnik; pokušajte (toservikemessenger.send (msg);) uhvatiti uhvatiti (e.printstacktrace () ;)) Javna prazna kompanija (gumb View) (, testservice.count_minus); msg .replyto. \u003d glasnik; Pokušajte (toservikemessenger.send (msg);) ulov (e.printstacktrace ();))) privatni class dolaznhandler se proteže rukovatelj (@verride javno void ručni memerlessage (msg.what) (mase testservice. Get_count: log.d (oznaka, Aktivnost) ... dobiti broj "); testtxt.settxext (" "+ msg.arg1); pauza;))) privatni razred testserviceConnection implementira serviceConnection (@verride javno void onserviceConnected (ime komponentna ime, ibinder servis) (tocervikemessenger \u003d novi glasnik) ; // poslati početnu vrijednost poruke msg \u003d message.obtain counter (, testservice.set_count); msg.replyto \u003d glasnik; msg.arg1 \u003d 0; // naša brojač pokušajte (toservikemessenger.send (msg);) Uhvatiti (remoteexception e) (e.printstacktrace ();)) @overide javno void onservisicsisconnected (ime komponenti))))
Objasnit ću. Prilikom stvaranja aktivata, mi smo odmah vezani za uslugu, implementaciju sučelja serviceceConnection i pošaljete poruku na uslugu "Postavite pult vrijednost", prolazeći nula i stvaranje toservikemessenger, prolazeći ibinder sučelje na dizajner. Usput, u službi je potrebno vratiti ovaj ehemple, inače će biti NPE. S ovim razredom šaljemo poruku usluzi. I ovdje je magija - uštedimo naš drugi primjer Messenger na odgovori varijable - onaj koji dobiva odgovor s poslužitelja i to je kroz nju koja će komunicirati s activ.
Da biste primili poruku od usluge, koristite rukovatelj i samo tražite varijable koje trebamo i učiniti akciju na njima. Klićima na gumbe (CountinCrclick, SountDecrick Metode), pošaljite zahtjeve na uslugu, navodeći željenu radnju u msg.what varijabli.
Paket com.example.servicetest; Uvoz android.app.aplica; Uvesti android.Content. *; Uvesti android.os. *; Uvoz android.os.Process; Uvoz android.util.log; javna klasa testservice proširuje servis (javni statički finalni int count_plus \u003d 1; javna statička finalna int count_minus \u003d 2; javna statička finalna int_count \u003d 0; javna statička finalna int_count \u003d 3; int count \u003d 0; incungerhandler uhander; glasnik messenger; Messenger Messenger ToaactivityMessenger; @OERRIDE javni praznin () (super.oncreate (); handlerthread thread \u003d novi ručnor ("serviceStartargmentgments", proces.thread_priory_background); nit.start (); nehardler \u003d novi dolaznik ()); \u003d Novi Messenger (Nehanndler);) @Override Javni Ibinder najuboj (povratak messenger.getfirder ();) @overide javna namjera onStartcommand (povratak start_sticky;) // Aktivnosti rukovatelja poruka Privatni razred IncomingHandler Produši rukovatelj (Super Looper) (Looper Looper) (Looper Looper) @Override Javno void RukeMessage (poruka Msg) (//Super.handlemessage(MG); toaaativnost gnjev \u003d msg.replyto; Prekidač (msg.what \u003d msg.arg1; log.d (Mainactivity.tag, (usluga) ... Set count "); pauza; Case count_plus: count ++; log.d (Mainactivity.tag," (usluga ) ... grof plus "); pauza; Case count_minus: log.d (Mainactivity.tag," (usluga) ... Broj minus "); brojanje--; pauza;) // pošaljite vrijednost brojila u aktivnost Outmsg \u003d poruka.Obtain (inhandar, get_count); izdmseg.arg1 \u003d Broj; outmsh.replyto \u003d menžer; Pokušajte (ako (toaactivitymessenger! \u003d Null) toaactivityMessenger.send (izvanmsh);) ulov (e.printstacktrace ();))))))
Sve po analogiji logikom u aktivnostima. Ne znam ni ako trebate nešto objasniti. Jedini trenutak je da odmah pošaljem zahtjev za aktiviranje u rukama, koristeći čarobnu varijabilnu odgovoru i povlačenje gore navedenog glasnika iznad. A drugi trenutak koji sam već rekao je:
@Overide Javni ibinder na bazi (namjera Arg0) (povratak messenger.getfirder ();)
bez kojih sve padne. To je to primjer sučelja koji će se prenijeti na serviceConnection.
Zaključak
Općenito, sve. Takav izrečeni primjer interakcije aktivata i usluga. Čini mi se da je ne-trivijalna interakcija lijepa, iako netko može izgledati drugačije.
Pitanja, pojašnjenja i drugi u PM-u. Mogu postojati netočnosti o svim aspektima, tako da slobodno pišete i ispravite.
Nadam se da je post koristan čitateljima.
Zdravo.
Morate proslijediti podatke dobivene putem UART-a u aktivnostima. To se može postići stvaranjem struje u aktivnosti u kojoj organiziranje vremena (!) Ciklus) i dostaviti podatke iz UART pufera. Nakon toga, pozivanjem UI struje aktivnosti - Mainactivity.This.Runonuithread (novi izvodljivo (), obavljaju potrebne radnje s ovom aktivnošću. Ali ako pozivamo druge aktivnosti iz glavne aktivnosti, onda organizirana nit ne dopušta prijenos podatke u novostvorenu aktivnost. Ako ispravno razumijem, tako da se podaci iz potoka mogu prenijeti na bilo koju aktivnost, protok mora biti stvoren u aktivnosti, već u službi.
Pitanje: UAR je primio podatke, u potoku (koji je stvoren u službi), potrebno je prenijeti podatke na aktivnost, što je sada aktivno, kako se to može učiniti i to je učinjeno uopće?
1 odgovor
U svakoj aktivnosti stvorite rukovatelj. U metodi onresume (), ova aktivnost čini vendservice (). Tamo je jedan od parametara sučelje serviseconnection. Implementacija je barem iste aktivnosti. Provesti u njemu onserviceConnected (). U ovom povratnom pozivu jedan od parametara dolazi na samu uslugu. Nazovite Sethandler () iz ove usluge. Proći rukovatelj tamo, koji je u trenutnoj aktivnosti. A ovdje su dolazni podaci o bacanju UART-a u usluzi na ovom rukom. Usput, rukovatelj tradicionalno radi u glavnoj niti, tako da neće biti potrebno izvršiti runonuithread.
Zadnje ažurirano: 04/03/2018
Za prijenos podataka između dvije aktivnosti koristi se objekt namjere. Kroz metodu PUTEXTRA () možete dodati ključ i povezanu vrijednost.
Na primjer, prijenos od trenutne aktivnosti u sendivity "Hello World" nizovi s ključem "Hello":
// Stvaranje namjernog objekta za pokretanje ciljanog ciljanog ciljanosti \u003d nova namjera (ova, seconctivity.class); // prijenos objekta s "Hello" ključ i "Hello World" vrijednost namjere. PutExtra ("Pozdrav", "Hello World"); // početak pokretanja sredstva za unduktivnost (namjera);
Metoda PUTEXTRA () koristi se za prijenos podataka, koji je kao vrijednost omogućuje prijenos najjednostavnijih vrsta tipa podataka - string, int, plutaju, dvostruki, dugi, kratki, bajt, char, nizovima tih vrsta ili Serializirajući objekt sučelja.
Da biste dobili poslane podatke prilikom učitavanja senduktivnosti, možete koristiti metodu dobivanja () u kojoj se prenosi tip ključ:
Bundle argumenti \u003d GetIntent (). GetExtras (); Naziv niza \u003d argumenti ("Hello"). Tostring (); // Pozdrav svijete.
Ovisno o vrsti poslanih podataka, kada primimo, možemo koristiti brojne metode objekta paketa. Svi oni prihvaćaju ključ objekta kao parametar. Glavni su:
dobijte (): univerzalna metoda koja vraća vrijednost vrste objekata. Prema tome, polje primitka mora se pretvoriti u željeni tip
getstruing (): Vraća string objekta
gerint (): vraća vrijednost tipa int
getbyte (): vraća vrijednost tipa bajta
getchachar (): vraća vrijednost tvog char
getshort (): Vraća vrijednost kratke vrste
getlong (): vraća dugu vrijednost
getfloat (): Vraća vrijednost vrste plovka
getDouble (): vraća dvostruku vrijednost
getBoolean (): vraća vrijednost tipa Boolean
getCharray (): vraća niz znakova predmeta
getintaray (): Vraća niz int objekata
getfloatarray (): vraća niz plovnih objekata
getEryrializable (): vraća serializirajući objekt sučelja
Dopustite da ćemo u projektu biti definirani dvije aktivnosti: materijaktivnost i sentraktivnost.
U kod sentraktivnosti odredit ćemo podatke o dobivanju:
Paket com.example.egene.serializeapp; Uvoz android.Support.v7.App.appcompatactivity; Uvoz android.os.bundle; Uvoz android.widget.textVex; Unduktivnost javne klase proširuje APPcompatactivity (@OVERRIDE ZAŠTIĆENO OSCRATE) (Skup savedinstancestat) (super.oncreate (SaveDinstancestate); TextView TextView \u003d novi TextView (ovaj); TextView.setssize (16, 16, 16, 16 ); Bundle argumenti \u003d getIntent (). GetExtras (); ako (argumenti! \u003d Null) (naziv niza \u003d arguments.get). Tostring (); string tvrtka \u003d arguments.getstring ("tvrtka"); Getint ("Cijena"); TextView.setsetxt ("Naziv:" + Naziv + "NCOMPANY:" + Tvrtka + "Nprice:" Cijena);) SetconntentView (TextView);))
U ovom slučaju, u sentraktivnosti dobivamo sve podatke iz objekta paketa i prikazali ih u tekstualnom okviru TextView. Pretpostavlja se da će se ova aktivnost prenijeti tri elementa - dva reda s imenom i ključem tvrtke i ključ s ključnom cijenom.
Sada ćemo definirati prijenos na sentraktivnost podataka. Na primjer, definiramo sljedeće sučelje za masaktivnost u datoteci Activity_main.xml:
Ovdje su tri tekstualna polja za unos podataka i gumb.
U razredu masaktivnosti definiramo sljedeći sadržaj:
Paket com.example.egene.serializeapp; Uvoz android.content.intent; Uvoz android.Support.v7.App.appcompatactivity; Uvoz android.os.bundle; Uvoz android.View.View; Uvoz android.widget.editext; Voditeljica javne klase proširuje APPcompatactivity (@OERRIDE ZAŠTIĆENO OSTAVLJENA (SVENDLE SAVEDSINSTANCESTATE) (super.oncreat (savedstancestat); setcontentview (r.layout.activity_main);)) .Ame); Final Edittext TvrtkaText \u003d FindViewByid (r.id.comPany); Final Edittext tocxexth \u003d FindViewByid (R.ID.PRICE); Naziv niza \u003d NameText.getText (). Tostring (); ) .Tostring (); Int Cijena \u003d INTEGER.PARSAINT (PRICTXEXT.Ettext (). Tostring ()); intenzivan intenzitet \u003d nova namjera (to, sentraktivnost.class); namjera.putyExtra ("ime", ime); namjera. Putextra ("tvrtka", tvrtka); intentrent.putExtra ("cijena", cijena); potaknutljivost (namjera);))))
U gumbu pritiskom na tipku, dobivate podatke unesene u tekstualne polja, podatke i prenose ih na objekt namjere pomoću metode PUTEXTRA (). Zatim pokrenite sredstva.
Kao rezultat toga, kada kliknete na gumb pokreće se sondiktivnost, koji će dobiti neke podatke unesene u tekstualne polja.
Prijenos složenih predmeta
U primjeru, jednostavni podaci su preneseni - brojevi, linije. Ali također možemo prenositi teže podatke. U ovom slučaju se koristi mehanizam serijalizacije.
Na primjer, dopustite da ćemo u projektu biti definirani razredom proizvoda:
Paket com.example.egene.serializeapp; Uvoz java.io.serializable; Proizvod za javnu klasu implementira serijalizabilno (naziv privatnog niza; tvrtka privatna string; privatni spoj cijena; javni proizvod (naziv niza, string tvrtka, Int cijena) (this.name \u003d ime; this.price \u003d tvrtka;) Javni string GetName () (Naziv povratka;) Javna praznina (naziv niza) (this.name \u003d ime;) Javni string GetCompany () (Povratna tvrtka;) Javna praznina Setcompany (Thing Company \u003d Društvo)) Javna int Pišeprice () (povratna cijena;) Javna praznina (Int Cijena) (this.price \u003d;)))
Važno je napomenuti da ovaj razred implementira serijalizabilno sučelje. Sada ćete promijeniti kod za masaktivnost:
Paket com.example.egene.serializeapp; Uvoz android.content.intent; Uvoz android.Support.v7.App.appcompatactivity; Uvoz android.os.bundle; Uvoz android.View.View; Uvoz android.widget.editext; Voditeljica javne klase proširuje APPcompatactivity (@OERRIDE ZAŠTIĆENO OSTAVLJENA (SVENDLE SAVEDSINSTANCESTATE) (super.oncreat (savedstancestat); setcontentview (r.layout.activity_main);)) .Ame); Final Edittext TvrtkaText \u003d FindViewByid (r.id.comPany); Final Edittext tocxexth \u003d FindViewByid (R.ID.PRICE); Naziv niza \u003d NameText.getText (). Tostring (); ) .Tring (); Int Cijena \u003d INTEGER.PARSEINT (PRICTXEXT.Gettext (). tostring ()); proizvod proizvoda \u003d novi proizvod (ime, tvrtka, cijena); namjerna namjera \u003d nova namjera (to, seconctivity.class); Intent.PutExtra (proizvod.Class.getsEmPleName (), proizvod); StartActivity (namjera);))
Sada, umjesto tri raspršene podatke, jedan objekt proizvoda se prenosi. Kao ključ, rezultat je rezultat proizvoda.Class.getsImPlename () metoda, koja u biti vraća ime razreda.
I promijenite razred sentraktivnosti:
Paket com.example.egene.serializeapp; Uvoz android.Support.v7.App.appcompatactivity; Uvoz android.os.bundle; Uvoz android.widget.textVex; Unduktivnost javne klase proširuje APPcompatactivity (@OVERRIDE ZAŠTIĆENO OSCRATE) (Skup savedinstancestat) (super.oncreate (SaveDinstancestate); TextView TextView \u003d novi TextView (ovaj); TextView.setssize (16, 16, 16, 16 ); Bundle argumenti \u003d GetIntent (). GetExtras (); konačni proizvod proizvoda; ako (argumenti! \u003d Null) (proizvod \u003d (proizvod) argumenti.geseReriZable (proizvod.Class.getsImPlename ()); TextViet.settext ("Ime: "+ Product.getName () +" \\ TCompany: "+ Proizvod.GetCompany () +" Nprice: "+ string.valueof (proizvod.getprice ()));)).);)
GetErializable () metoda se primjenjuje za dobivanje podataka, budući da klasa proizvoda implementira serijalizabilno sučelje. Dakle, možemo prenositi jedan objekt umjesto na biranje različitih podataka.