Transmiterea datelor între activitate și serviciu. Comunicarea între activitate și serviciu

O aplicație nu constă întotdeauna dintr-un singur ecran. De exemplu, am creat o foarte program util iar utilizatorul dorește să știe cine este autorul. Face clic pe butonul „Despre program” și ajunge la un nou ecran, unde există informații utile despre versiunea programului, autor, adresa site-ului, câte pisici are autorul etc. Gândiți-vă la un ecran de activitate ca la o pagină web cu un link către o altă pagină. Dacă te uiți la codul din fișier MainActivity.java din lecțiile anterioare, veți vedea că clasa noastră Activitate principala se aplica si la Activitate(sau moștenitorii săi) sau, mai precis, moștenit de la el.

Clasa publică MainActivity extinde AppCompatActivity

După cum ați putea ghici, ar trebui să creăm o nouă clasă, care ar putea arăta Activitate principalași apoi cumva comutați la el când este apăsat butonul.

Pentru experiment, vom lua programul din prima lecție și vom folosi butonul pentru experimente (sau pentru a crea proiect nou cu un singur buton pe ecran). În continuare, să creăm formă nouă a afișa Informatii utile... De exemplu, să arătăm utilizatorului ce face pisica când merge în stânga și în dreapta. De acord, asta este foarte Informații importante, dând un indiciu despre univers.

Vom crea o activitate nouă manual, deși studioul are șabloane gata făcute. Dar nu este nimic complicat și pentru o mai bună înțelegere este util să faci totul manual.

Să creăm un nou fișier de marcare XML activity_about.xmlîn dosar res / layout... Faceți clic dreapta pe folder aspect si alege din meniul contextual Nou | Fișier cu resurse de aspect... Va apărea o casetă de dialog. În primul câmp, introduceți numele fișierului activitate_despre... În al doilea, trebuie să introduceți elementul rădăcină. În mod implicit există ConstraintLayout... Ștergeți textul și introduceți ScrollView... Introducerea câtorva caractere este suficientă pentru ca studioul să sugereze opțiuni gata făcute, puteți apăsa imediat Enter, fără a aștepta introducerea completă a cuvântului:

Vom obține spațiul liber corespunzător, în care vom introduce elementul. TextView.

Informațiile vor fi preluate din resurse, și anume dintr-o resursă șir despre_text... Acum este evidentiat cu rosu, semnaland lipsa de informatii. Ai putea apăsa Alt + Enterși introduceți text în caseta de dialog. Dar, pentru exemplul nostru, această metodă nu va funcționa, deoarece textul nostru va fi pe mai multe linii, folosind caractere de control. Deci hai să o facem altfel. Să deschidem fișierul res / values ​​/ strings.xmlși introduceți manual următorul text:

Un stejar verde pe malul mării; \ n Un lanț de aur pe un stejar tom: \ n Zi și noapte pisica de stiinta\ n Totul se învârte într-un lanț; \ n Merge dreapta- începe cântecul, \ n Stânga- spune un basm.

Am folosit cele mai simple etichete de formatare a textului HTML, cum ar fi , , ... Pentru exemplul nostru, este suficient să evidențiem cu aldine cuvintele care se referă la pisică și la direcția de mișcare. Pentru a traduce textul în linie nouă utilizați simboluri \ n... Să adăugăm o altă resursă șir pentru titlul noului ecran:

Despre program

Ne-am dat seama de marcaj. Apoi, trebuie să creați o clasă pentru fereastră DespreActivity.java... Alegeți din meniu Fișier | Nou | Clasa Javași completați câmpurile obligatorii. La început, este suficient să indicați doar numele. Apoi ocupă-te de alte domenii.

Să luăm un gol.

Clasa este acum aproape goală. Să adăugăm manual codul. Clasa trebuie să moștenească din clasa abstractă Activitate sau rudele lui ca FragmentActivity, AppCompatActivity etc. Adaugam extinde Activitatea... Clasa de activitate trebuie să aibă o metodă onCreate ()... Punem cursorul mouse-ului în interiorul clasei și selectăm din meniu Cod | Metode de anulare(Ctrl + O). În caseta de dialog, căutăm clasa dorită, puteți introduce primele caractere de pe tastatură pentru cautare rapida... În metoda creată, trebuie să apelați metoda setContentView () care va încărca pe ecran marcajul pregătit. Vom primi această opțiune.

Pachetul ru.alexanderklimov.helloworld; import android.app.Activity; import android.os.Bundle; / ** * Creat de Alexander Klimov la 01.12.2014. * / clasa publică AboutActivity extinde Activitatea (@Override protected void onCreate (Bundle savedInstanceState) (super.onCreate (savedInstanceState); setContentView (R.layout.activity_about);))

Acum începe cel mai important lucru. Sarcina noastră este să mergem la un nou ecran când se face clic pe butonul de pe primul ecran. Întoarce-te la clasă Activitate principala... Să scriem un handler de clic pe buton:

Public void onClick (Vizualizare vizualizare) (intenție de intenție = intenție nouă (MainActivity.this, AboutActivity.class); startActivity (intent);)

Aici am folosit metoda de gestionare a clicurilor pe butoane pe care am descris-o în lecție.

Pentru a începe un nou ecran, trebuie să creați o instanță a clasei Intențieși specificați clasa curentă în primul parametru și clasa pentru tranziție în al doilea parametru, avem aceasta DespreActivitate... După aceea, metoda este numită startActivity () care lansează un nou ecran.

Dacă încercați acum să testați funcționarea aplicației în emulator, veți primi un mesaj de eroare. Ce am greșit? Am ratat un pas important. Trebuie să înregistrați unul nou Activitateîn manifest AndroidManifest.xml... Găsiți acest fișier în proiectul dvs. și faceți dublu clic pe el. Se va deschide fereastra de editare a fișierului. Adăugați o nouă etichetă după eticheta de închidere pentru prima activitate. Imprimați-vă și utilizați în mod activ instrucțiunile. Rezultatul este următorul:

Deci resursa șir a fost utilă despre_titlu... Lansați aplicația, faceți clic pe butonul și obțineți fereastra Despre program... Astfel, am învățat cum să creăm o fereastră nouă și să o apelăm la clic pe un buton. Și avem la dispoziție un program mega-convenient - acum va fi mereu la îndemână un indiciu ce face pisica când merge spre stânga.

Încă o dată vă atrag atenția asupra faptului că a doua clasă de activitate creată trebuie să moștenească din clasă Activitate sau similar cu el ( ListActivityși altele), să aibă un fișier de markup XML (dacă este necesar) și să fie scris în manifest.

După apelarea metodei startActivity () va începe o nouă activitate (în acest caz DespreActivitate), devine vizibil și se deplasează în partea de sus a stivei care conține componentele care rulează. La apelarea metodei finalizarea () dintr-o activitate nouă (sau când este apăsată o tastă de revenire tare) va fi închisă și scoasă din stivă. Dezvoltatorul poate naviga și la activitatea anterioară (sau la orice altă activitate) folosind aceeași metodă. startActivity ().

Cum să creați un al treilea ecran - o modalitate pentru leneși

Programatorii, ca și pisicile, sunt creaturi leneșe. Amintiți-vă întotdeauna că pentru activitate trebuie să creați un marcaj și o clasă de la care moștenește Activitate, și apoi nu uitați să înregistrați clasa în manifest - bine nafig.

În acest caz, selectați din meniu Fișier | Nou | Activitate | Activitate de bază(sau alt șablon). În continuare, va apărea fereastra familiară pentru crearea unei noi activități. Completam campurile obligatorii.

Faceți clic pe butonul finalizarea iar activitatea va fi gata. Pentru a verifica acest lucru, deschideți fișierul manifest și verificați dacă există o nouă intrare. Nu vorbesc despre fișierele de clasă și de markup, ele înșiși vor apărea în fața ta.

Adăugați singur un buton nou pe ecranul principal de activitate și scrieți codul pentru a merge la activitatea creată.

La început, v-aș sfătui să creați manual toate componentele necesare pentru o nouă activitate pentru a înțelege relația dintre clasă, markup și manifest. Și când puneți mâna pe el, puteți utiliza Expertul de creare a activității pentru a vă accelera munca.

Transferul de date între activități

Am folosit cel mai simplu exemplu pentru a apela un alt ecran de activitate. Uneori este necesar nu numai să apelați un nou ecran, ci și să transferați date către acesta. De exemplu, numele de utilizator. În acest caz, trebuie să utilizați o zonă specială extraData pe care o are clasa Intenție.

Regiune extraData este o listă de cupluri valoare cheie care se transmite împreună cu intenția. Șirurile sunt folosite ca chei, iar pentru valori puteți folosi orice tip de date primitive, matrice de primitive, obiecte de clasă Pachet si etc.

Pentru a transfera date către o altă activitate, utilizați metoda puneExtra ():

Intent.putExtra ("Cheie", "Valoare");

Activitatea de recepție ar trebui să apeleze la o metodă adecvată: getIntExtra (), getStringExtra () etc.:

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

Să refacem exemplul anterior. Avem deja trei activități. Prima activitate va avea două câmpuri de text și un buton. Aspectul poate fi după cum urmează:

A doua activitate A doua activitate instalați elementul TextView, în care vom afișa textul primit de la prima activitate. Să scriem următorul cod pentru metodă onCreate () la a doua activitate.

@Override protected void onCreate (Bundle savedInstanceState) (super.onCreate (savedInstanceState); setContentView (R.layout.activity_second); String user = „Live”; String gift = „goașă”; TextView infoTextView = (TextView) findViewById R. id.textViewInfo); infoTextView.setText (utilizator + „, vi s-a oferit” + cadou);)

Dacă pornim programul acum și doar apelăm a doua fereastră, așa cum este descris în prima parte a articolului, vom vedea eticheta implicită Zhivotnoe, ți s-a dat o gaură pentru gogoși... De acord, este destul de păcat să primești astfel de mesaje.

Reparăm situația. Adăugați codul pentru prima activitate:

Public void onClick (Vizualizare vizualizare) (EditText userEditText = (EditText) findViewById (R.id.editTextUser); EditText giftEditText = (EditText) findViewById (R.id.editTextGift); Intenție = noua clasă Intenție /SecondActivity); / împingeți textul din primul câmp de text în cheia numelui de utilizator intent.putExtra ("nume de utilizator", userEditText.getText (). toString ()); // împinge textul din al doilea câmp de text în cheia cadou intent.putExtra ( „cadou”, giftEditText.getText (). toString ()); startActivity (intent);)

Am plasat un obiect într-un recipient special Intenție două chei cu valori preluate din câmpurile de text. Când utilizatorul introduce date în câmpurile de text, va merge în acest container și va fi transferat la a doua activitate.

A doua activitate ar trebui să fie pregătită pentru a primi mesaje calde după cum urmează (în aldine).

// Valori implicite ​​String user = "Live"; String gift = „găuri pentru gogoși”; utilizator = getIntent (). getExtras (). getString ("nume utilizator"); cadou = getIntent (). getExtras (). getString ("cadou"); TextView infoTextView = (TextView) findViewById (R.id.textViewInfo); infoTextView.setText (utilizator + „, vi s-a oferit” + cadou);

Acum mesajul nu pare atât de ofensator, dar chiar plăcut pentru unii oameni. În exemplele complexe, este de dorit să adăugați validare la procesarea datelor. Există situații când începeți a doua activitate cu date goale, cum ar fi nul care ar putea bloca aplicația.

În cazul nostru, știm că așteptăm o valoare șir, așa că codul poate fi rescris astfel:

Intent intent = getIntent (); user = intent.getStringExtra („nume utilizator”);

Utilizator = getIntent (). GetStringExtra ("nume utilizator");

Programul are un dezavantaj - nu este clar de la cine primim salutări. Orice maimuță educată nu va accepta un cadou dintr-o sursă anonimă. Deci, ca temă pentru acasă, adăugați un alt câmp de text pentru a introduce numele utilizatorului care trimite mesajul.

Google recomandă utilizarea următorului format pentru chei: numele pachetului dvs. ca prefix, urmat de cheia însăși. În acest caz, puteți fi sigur că cheia este unică atunci când interacționați cu alte aplicații. Ceva de genul:

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

Cine a înrămat pisica Vaska - obținem rezultatul înapoi

Nu este întotdeauna suficient să transmiteți pur și simplu date unei alte activități. Uneori doriți să obțineți informații din altă activitate când o închideți. Dacă mai devreme am folosit metoda startActivity (intenție de intenție), atunci există o metodă înrudită startActivityForResult (intenție de intenție, int RequestCode)... Diferența dintre metode este parametrul suplimentar RequestCode... Practic, este doar un număr întreg pe care îl poți inventa singur. Este necesar pentru a distinge de la cine a venit rezultatul. Să presupunem că aveți cinci ecrane suplimentare și le atribuiți valori de la 1 la 5, iar din acest cod puteți determina al cui rezultat trebuie să procesați. Puteți utiliza valoarea -1, atunci va fi la fel cu apelarea metodei startActivity (), adică nu vom obține niciun rezultat.

Daca folosesti metoda startActivityForResult (), atunci trebuie să înlocuiți metoda din cod pentru a primi rezultatul onActivityResult ()și procesează rezultatul. Confuz? Să luăm un exemplu.

Să presupunem că ești detectiv. Au existat informații că două bucăți de cârnați și alte produse au fost furate de pe masa unei persoane influente dintr-un restaurant. Suspiciunea a căzut asupra a trei suspecți - o cioară, un nenorocit de cățeluș și pisica Vaska.

Unul dintre vizitatori a oferit o serie de fotografii de pe iPhone-ul său ponty:


Există și mărturie de la un alt martor: Și Vaska ascultă, dar mănâncă.

Creați un nou proiect Sherlock cu două activități. Pe primul ecran va apărea un buton pentru a trece la al doilea ecran și o etichetă text în care va fi afișat numele hoțului.