Prijenos podataka između aktivnosti i usluge. Komunikacija između aktivnosti i usluge

Aplikacija se ne sastoji uvijek od jednog ekrana. Na primjer, kreirali smo vrlo koristan program a korisnik želi znati ko je autor. On klikne na dugme "O programu" i dođe na novi ekran, gde se nalaze korisne informacije o verziji programa, autoru, adresi sajta, koliko mačaka autor ima itd. Zamislite ekran aktivnosti kao web stranicu sa vezom na drugu stranicu. Ako pogledate kod u datoteci MainActivity.java iz prethodnih lekcija, vidjet ćete da naš razred MainActivity takođe se odnosi na Aktivnost(ili njegovih nasljednika) ili, tačnije, naslijeđeno od njega.

Javna klasa MainActivity proširuje AppCompatActivity

Kao što možete pretpostaviti, trebali bismo kreirati novu klasu, koja bi mogla izgledati ovako MainActivity i onda se nekako prebaci na njega kada se pritisne dugme.

Za eksperiment ćemo uzeti program iz prve lekcije i koristiti dugme za eksperimente (ili kreirati novi projekat sa jednim dugmetom na ekranu). Zatim krenimo nova forma prikazati korisne informacije... Na primjer, pokažimo korisniku šta mačka radi kada hoda lijevo-desno. Slažem se, ovo je veoma važna informacija, dajući trag svemiru.

Novu aktivnost ćemo kreirati ručno, iako studio ima gotove šablone. Ali nema ništa komplicirano i za bolje razumijevanje korisno je sve raditi ručno.

Kreirajmo novi XML markup fajl activity_about.xml u folderu res / izgled... Desni klik na folder raspored i birajte između kontekstni meni Novo | Datoteka resursa rasporeda... Pojavit će se okvir za dijalog. U prvo polje unesite naziv datoteke aktivnost_o... U drugom, morate unijeti korijenski element. Podrazumevano postoji ConstraintLayout... Obrišite tekst i unesite ScrollView... Unošenje nekoliko znakova dovoljno je da studio predloži gotove opcije, možete odmah pritisnuti Enter, ne čekajući potpuni unos riječi:

Dobit ćemo odgovarajuće prazno mjesto u koje ćemo umetnuti element. TextView.

Informacije će se preuzeti iz resursa, odnosno iz string resursa about_text... Sada je označen crvenom bojom, što ukazuje na nedostatak informacija. Mogao bi pritisnuti Alt + Enter i unesite tekst u dijaloški okvir. Ali za naš primjer, ova metoda neće raditi, jer će naš tekst biti višeredni, koristeći kontrolne znakove. Učinimo to drugačije. Hajde da otvorimo fajl res / values ​​/ strings.xml i ručno unesite sljedeći tekst:

Zeleni hrast na obali mora; \ n Zlatni lanac na hrastu: \ n Dan i noć naučnik mačka\ n Sve ide okolo u lancu; \ n Ide u pravu- pjesma počinje, \ n lijevo- kaže bajka.

Koristili smo najjednostavnije HTML oznake za formatiranje teksta kao što su , , ... Za naš primjer, dovoljno je podebljano istaknuti riječi koje se odnose na mačku i smjer kretanja. Za prevođenje teksta u nova linija koristiti simbole \ n... Dodajmo još jedan string resurs za naslov novog ekrana:

O programu

Shvatili smo maržu. Zatim morate kreirati klasu za prozor AboutActivity.java... Odaberite iz menija Fajl | Novo | Java klasa i popunite obavezna polja. U početku je dovoljno navesti samo ime. Zatim se bavite drugim poljima.

Hajdemo na prazno.

Čas je sada skoro prazan. Dodajmo kod ručno. Klasa mora naslijediti apstraktnu klasu Aktivnost ili njegovi rođaci kao FragmentActivity, AppCompatActivity itd. Mi dodajemo proširuje aktivnost... Klasa aktivnosti mora imati metodu onCreate ()... Stavljamo kursor miša u klasu i biramo iz menija Šifra | Nadjačajte metode(Ctrl + O). U dijalog box-u tražimo željenu klasu, za koju možete ukucati prve znakove na tastaturi brza pretraga... U kreiranoj metodi, morate pozvati metodu setContentView () koji će učitati pripremljene oznake na ekran. Dobićemo ovu opciju.

Paket ru.alexanderklimov.helloworld; import android.app.Activity; import android.os.Bundle; / ** * Kreirao Alexander Klimov 01.12.2014. * / javna klasa AboutActivity proširuje aktivnost (@Override zaštićena void onCreate (Bundle savedInstanceState) (super.onCreate (savedInstanceState); setContentView (R.layout.activity_about);))

Sada počinje ono najvažnije. Naš zadatak je da pređemo na novi ekran kada se klikne na dugme na prvom ekranu. Vrati se u razred MainActivity... Hajde da napišemo obrađivač klika na dugme:

Public void onClick (prikaz prikaza) (namjera namjere = nova namjera (MainActivity.this, AboutActivity.class); startActivity (namjera);)

Ovdje sam koristio metodu za rukovanje klikovima na gumbe koju sam opisao u lekciji.

Da biste pokrenuli novi ekran, morate kreirati instancu klase Namjera i navedite trenutnu klasu u prvom parametru, a klasu za prijelaz u drugom parametru, imamo ovo AboutActivity... Nakon toga se poziva metoda startActivity () koji pokreće novi ekran.

Ako sada pokušate testirati rad aplikacije u emulatoru, dobit ćete poruku o grešci. Šta smo pogriješili? Promašili smo jedan važan korak. Morate registrovati novu Aktivnost u manifestu AndroidManifest.xml... Pronađite ovu datoteku u svom projektu i dvaput kliknite na nju. Otvara se prozor za uređivanje fajla. Dodajte novu oznaku nakon završne oznake za prvu aktivnost. Štampajte sami i aktivno koristite upite. Rezultat je sljedeći:

Tako je string resurs dobro došao about_title... Pokrenite aplikaciju, kliknite na dugme i otvorite prozor O programu... Tako smo naučili kako da kreiramo novi prozor i pozovemo ga pritiskom na dugme. A na raspolaganju imamo i mega-praktičan program - sada će uvijek biti pri ruci nagovještaj šta mačka radi kada krene lijevo.

Još jednom vam skrećem pažnju na činjenicu da druga kreirana klasa aktivnosti mora naslijediti klasu Aktivnost ili njemu slično ( ListActivity i drugi), imaju XML markup datoteku (ako je potrebno) i budu upisani u manifest.

Nakon poziva metode startActivity () nova aktivnost će započeti (u ovom slučaju AboutActivity), postaje vidljiv i pomiče se na vrh steka koji sadrži komponente koje se izvršavaju. Prilikom pozivanja metode završiti () iz nove aktivnosti (ili kada se pritisne tipka za povratak) biće zatvorena i uklonjena iz steka. Programer također može navigirati do prethodne (ili bilo koje druge) aktivnosti koristeći isti metod. startActivity ().

Kako napraviti treći ekran - način za lijene

Programeri su, kao i mačke, lijena stvorenja. Uvijek zapamtite da za aktivnost trebate kreirati markup i klasu koja nasljeđuje od Aktivnost, i onda ne zaboravite da registrujete klasu u manifestu - pa nafig.

U tom slučaju izaberite iz menija Fajl | Novo | Aktivnost | Osnovna aktivnost(ili neki drugi šablon). Zatim će se pojaviti poznati prozor za kreiranje nove aktivnosti. Popunjavamo obavezna polja.

Kliknite na dugme Završi i aktivnost će biti spremna. Da biste to potvrdili, otvorite datoteku manifesta i provjerite ima li novog unosa. Ne govorim o fajlovima klasa i markupa, oni će se sami pojaviti pred vama.

Dodajte novo dugme na glavni ekran aktivnosti i napišite kod za prelazak na kreiranu aktivnost.

U početku bih vam savjetovao da ručno kreirate sve potrebne komponente za novu aktivnost kako biste razumjeli odnos između klase, oznake i manifesta. A kada ga dobijete, možete koristiti čarobnjak za kreiranje aktivnosti da ubrzate svoj rad.

Prijenos podataka između aktivnosti

Iskoristili smo najjednostavniji primjer za pozivanje drugog ekrana aktivnosti. Ponekad je potrebno ne samo pozvati novi ekran, već i prenijeti podatke na njega. Na primjer, korisničko ime. U tom slučaju morate koristiti posebno područje extraData koje klasa ima Namjera.

Region extraData je lista parova ključ / vrijednost koji se prenosi zajedno sa namerom. Nizovi se koriste kao ključevi, a za vrijednosti možete koristiti bilo koji primitivni tip podataka, nizove primitiva, objekte klase Bundle i sl.

Za prijenos podataka u drugu aktivnost koristite metodu stavitiExtra ():

Intent.putExtra ("Ključ", "Vrijednost");

Aktivnost primanja treba da pozove neki odgovarajući metod: getIntExtra (), getStringExtra () itd.:

Int count = getIntent (). GetIntExtra ("name", 0);

Ponovimo prethodni primjer. Već imamo tri aktivnosti. Prva aktivnost će imati dva tekstualna polja i dugme. Izgled može biti sljedeći:

Druga aktivnost SecondActivity ugradite element TextView, u kojem ćemo prikazati tekst primljen iz prve aktivnosti. Napišimo sljedeći kod za metodu onCreate () na drugoj aktivnosti.

@Override zaštićeni void onCreate (Bundle savedInstanceState) (super.onCreate (savedInstanceState); setContentView (R.layout.activity_second); String user = "Live"; String gift = "krofna rupa"; TextView infoTextView = (TextIdView) find. id.textViewInfo); infoTextView.setText (korisnik + ", dobili ste" + poklon);)

Ako sada pokrenemo program i samo pozovemo drugi prozor, kao što je opisano u prvom dijelu članka, vidjet ćemo zadanu oznaku Zhivotnoe, dobio si rupu od krofne... Slažem se, šteta je primati takve poruke.

Popravljamo situaciju. Dodajte kod za prvu aktivnost:

Public void onClick (View view) (EditText userEditText = (EditText) findViewById (R.id.editTextUser); EditText giftEditText = (EditText) findViewById (R.id.editTextGift); Intent intent = nova klasa Namjere (SecondActivity)); / gurnite tekst iz prvog tekstualnog polja u ključ korisničkog imena intent.putExtra ("korisničko ime", userEditText.getText (). toString ()); // gurnite tekst iz drugog tekstualnog polja u ključ za poklon intent.putExtra ( "gift ", giftEditText.getText (). toString ()); startActivity (namjera);)

Stavili smo predmet u poseban kontejner Namjera dva ključa sa vrijednostima preuzetim iz tekstualnih polja. Kada korisnik unese podatke u tekstualna polja, on će otići u ovaj kontejner i biti prebačen na drugu aktivnost.

Druga aktivnost bi trebala biti spremna za primanje toplih poruka kako slijedi (podebljano).

// Zadane vrijednosti String user = "Uživo"; String gift = "krofna rupa"; korisnik = getIntent (). getExtras (). getString ("korisničko ime"); dar = getIntent (). getExtras (). getString ("gift"); TextView infoTextView = (TextView) findViewById (R.id.textViewInfo); infoTextView.setText (korisnik + ", dobili ste" + poklon);

Sada poruka ne izgleda tako uvredljivo, ali čak i prijatno za neke ljude. U složenim primjerima, poželjno je dodati validaciju prilikom obrade podataka. Postoje situacije kada drugu aktivnost započnete s praznim podacima kao što je nullšto bi moglo srušiti aplikaciju.

U našem slučaju znamo da čekamo vrijednost niza, pa se kod može prepisati ovako:

Namjera namjera = getIntent (); korisnik = intent.getStringExtra ("korisničko ime");

Korisnik = getIntent (). GetStringExtra ("korisničko ime");

Program ima nedostatak - nije jasno od koga primamo pozdrave. Svaki dobro vaspitan majmun neće prihvatiti poklon od anonimnog izvora. Dakle, kao domaći zadatak, dodajte još jedno tekstualno polje da unesete ime korisnika koji šalje poruku.

Google preporučuje korištenje sljedećeg formata za ključeve: ime vašeg paketa kao prefiks, nakon čega slijedi sam ključ. U ovom slučaju, možete biti sigurni da je ključ jedinstven u interakciji s drugim aplikacijama. Ovako nešto:

Javni konačni statički String USER = "ru.alexanderklimov.myapp.USER";

Ko je podmetnuo mačku Vasku - vraćamo rezultat

Nije uvijek dovoljno jednostavno proslijediti podatke drugoj aktivnosti. Ponekad želite da dobijete informacije iz druge aktivnosti kada je zatvorite. Ako smo ranije koristili metodu startActivity (namjera namjere), onda postoji srodna metoda startActivityForResult (namjera, int RequestCode)... Razlika između metoda je dodatni parametar RequestCode... To je u osnovi samo cijeli broj koji možete sami sastaviti. To je potrebno kako bi se razlikovalo od koga je došao rezultat. Recimo da imate pet dodatnih ekrana i da im dodijelite vrijednosti od 1 do 5, a iz ovog koda možete odrediti čiji rezultat trebate obraditi. Možete koristiti vrijednost -1, tada će to biti isto kao i pozivanje metode startActivity (), tj. nećemo dobiti nikakav rezultat.

Ako koristite metodu startActivityForResult (), tada morate nadjačati metodu u kodu da biste primili rezultat onActivityResult () i obraditi rezultat. Zbunjen? Uzmimo primjer.

Pretpostavimo da ste detektiv. Pojavila se informacija da su sa stola uticajne osobe u restoranu ukradena dva komada kobasica i drugi proizvodi. Sumnja je pala na trojicu osumnjičenih - vranu, jebenog psića i mačku Vasku.

Jedan od posjetilaca je dao seriju fotografija sa svog ponty iPhone-a:


Tu je i iskaz drugog svjedoka: A Vaska sluša, ali jede.

Kreirajte novi projekat Sherlock sa dvije aktivnosti. Na prvom ekranu će se nalaziti dugme za prelazak na drugi ekran i tekstualna oznaka u kojoj će biti prikazano ime lopova.