Předávání dat mezi aktivitou a službou. Komunikace mezi aktivitou a službou

Aplikace se nemusí vždy skládat z jedné obrazovky. Vytvořili jsme například velmi užitečný program a uživatel chce vědět, kdo je autor. Klikne na tlačítko „O programu“ a dostane se na novou obrazovku, kde jsou užitečné informace o verzi programu, autorovi, adrese webu, kolik má autor koček atd. Obrazovku aktivity si představte jako webovou stránku s odkazem na jinou stránku. Pokud se podíváte na kód v souboru MainActivity.java z předchozích lekcí uvidíte, že naše třída Hlavní aktivita platí také pro Aktivita(nebo jeho dědiců) nebo přesněji zděděných po něm.

Veřejná třída MainActivity rozšiřuje AppCompatActivity

Jak asi tušíte, měli bychom vytvořit novou třídu, která může vypadat takto Hlavní aktivita a pak se na to nějak přepnout při stisku tlačítka.

Pro experiment vezmeme program z první lekce a použijeme tlačítko pro experimenty (nebo vytvoříme nový projekt jedním tlačítkem na obrazovce). Dále pojďme tvořit nový formulář zobrazit užitečné informace... Ukažme například uživateli, co kočka dělá, když chodí doleva a doprava. Souhlasíte, toto je velmi důležitá informace, která poskytuje vodítko k vesmíru.

Novou aktivitu vytvoříme ručně, přestože má studio hotové šablony. Není to ale nic složitého a pro lepší pochopení je užitečné dělat vše ručně.

Pojďme vytvořit nový soubor značek XML activity_about.xml ve složce rozlišení / rozložení... Klikněte pravým tlačítkem na složku rozložení a vybrat si z kontextová nabídka Nový | Soubor prostředku rozložení... Zobrazí se dialogové okno. Do prvního pole zadejte název souboru činnost_o... Ve druhém musíte zadat kořenový prvek. Ve výchozím nastavení je ConstraintLayout... Vymažte text a zadejte ScrollView... Zadání několika znaků stačí, aby studio navrhlo hotové možnosti, můžete okamžitě stisknout Enter, aniž byste čekali na úplné zadání slova:

Dostaneme odpovídající polotovar, do kterého prvek vložíme. TextView.

Informace budou načteny ze zdrojů, konkrétně z řetězcového zdroje o_textu... Nyní je zvýrazněn červeně, což signalizuje nedostatek informací. Mohl bys stisknout Alt + Enter a zadejte text do dialogového okna. Ale pro náš příklad tato metoda nebude fungovat, protože náš text bude víceřádkový s použitím řídicích znaků. Tak na to pojďme jinak. Otevřeme soubor res / hodnoty / strings.xml a ručně zadejte následující text:

Zelený dub na břehu moře; \ n Zlatý řetěz na dubu tom: \ n Den a noc vědec kočka\ n Všechno jde v řetězci; \ n Jde že jo- píseň začíná, \ n Vlevo, odjet- říká pohádka.

Použili jsme nejjednodušší HTML značky pro formátování textu jako , , ... Pro náš příklad stačí tučně zvýraznit slova, která odkazují na kočku a směr pohybu. K překladu textu do nový řádek používat symboly \ n... Pojďme přidat další zdroj řetězce pro název nové obrazovky:

O programu

Přišli jsme na označení. Dále musíte vytvořit třídu pro okno AboutActivity.java... Vyberte si z nabídky Soubor | Nový | Třída Java a vyplňte požadovaná pole. Nejprve stačí uvést pouze jméno. Pak se zabývají dalšími obory.

Vezmeme si prázdno.

Třída je nyní téměř prázdná. Pojďme přidat kód ručně. Třída musí dědit z abstraktní třídy Aktivita nebo jako jeho příbuzní FragmentActivity, AppCompatActivity atd. Přidali jsme rozšiřuje Aktivitu... Třída aktivity musí mít metodu onCreate ()... Umístíme kurzor myši do třídy a vybereme z nabídky Kód | Přepsat metody(Ctrl + O). V dialogovém okně hledáme požadovanou třídu, pro kterou můžete zadat první znaky na klávesnici rychlé hledání... Ve vytvořené metodě je třeba metodu zavolat setContentView () který načte připravené označení na obrazovku. Tuto možnost získáme.

Balíček ru.alexanderklimov.helloworld; importovat android.app.Activity; importovat android.os.Bundle; / ** * Vytvořil Alexander Klimov dne 01.12.2014. * / public class AboutActivity rozšiřuje aktivitu (@Override protected void onCreate (Bundle savedInstanceState) (super.onCreate (savedInstanceState); setContentView (R.layout.activity_about);))

Nyní začíná to nejdůležitější. Naším úkolem je přejít na novou obrazovku po kliknutí na tlačítko na první obrazovce. Vraťte se do třídy Hlavní aktivita... Pojďme napsat obslužný program kliknutí na tlačítko:

Public void onClick (View view) (Intent intent = nový Intent (MainActivity.this, AboutActivity.class); startActivity (intent);)

Zde jsem použil metodu zpracování kliknutí na tlačítka, kterou jsem popsal v lekci.

Chcete-li spustit novou obrazovku, musíte vytvořit instanci třídy Úmysl a zadejte aktuální třídu v prvním parametru a třídu pro přechod ve druhém parametru, máme toto O Aktivitě... Poté je zavolána metoda startActivity () který spustí novou obrazovku.

Pokud se nyní pokusíte otestovat fungování aplikace v emulátoru, zobrazí se chybová zpráva. co jsme udělali špatně? Chybí nám jeden důležitý krok. Musíte zaregistrovat nový Aktivita v manifestu AndroidManifest.xml... Najděte tento soubor ve svém projektu a dvakrát na něj klikněte. Otevře se okno pro úpravu souboru. Přidat novou značku za uzavírací značkou na první aktivitu. Vytiskněte se a aktivně používejte výzvy. Výsledek je následující:

Zdroj řetězce se tedy hodil about_title... Spusťte aplikaci, klikněte na tlačítko a otevřete okno O programu... Naučili jsme se tedy, jak vytvořit nové okno a vyvolat jej kliknutím na tlačítko. A máme k dispozici megapohodlný program - nyní bude vždy po ruce nápověda, co kočka dělá, když jde doleva.

Ještě jednou upozorňuji na skutečnost, že druhá vytvořená třída aktivity musí dědit od třídy Aktivita nebo jemu podobný ( Aktivita seznamu a další), mít soubor značek XML (je-li vyžadován) a musí být zapsán v manifestu.

Po zavolání metody startActivity () začne nová aktivita (v tomto případě O Aktivitě), stane se viditelným a přesune se na vrchol zásobníku obsahujícího běžící komponenty. Při volání metody Dokončit () z nové aktivity (nebo když stisknete klávesu tvrdého návratu) bude uzavřena a odstraněna ze zásobníku. Vývojář může také přejít na předchozí (nebo jakoukoli jinou) aktivitu pomocí stejné metody. startActivity ().

Jak vytvořit třetí obrazovku - způsob pro líné

Programátoři, stejně jako kočky, jsou líná stvoření. Vždy si pamatujte, že pro aktivitu je třeba vytvořit označení a třídu, ze které dědí Aktivita, a poté nezapomeňte třídu zaregistrovat do manifestu - dobře nafig.

V tomto případě vyberte z nabídky Soubor | Nový | Aktivita | Základní činnost(nebo jinou šablonu). Dále se objeví známé okno pro vytvoření nové aktivity. Vyplníme povinná pole.

Klikněte na tlačítko Dokončit a aktivita bude připravena. Chcete-li to ověřit, otevřete soubor manifestu a vyhledejte nový záznam. Nemluvím o souborech tříd a značek, ty samy se před vámi objeví.

Sami si přidejte nové tlačítko na obrazovku hlavní aktivity a napište kód pro přechod na vytvořenou aktivitu.

Nejprve bych vám doporučil ručně vytvořit všechny potřebné komponenty pro novou aktivitu, abyste pochopili vztah mezi třídou, označením a manifestem. A když se vám to dostane do rukou, můžete si práci urychlit pomocí Průvodce tvorbou aktivity.

Přenos dat mezi aktivitami

Použili jsme nejjednodušší příklad k vyvolání obrazovky další aktivity. Někdy je potřeba nejen zavolat novou obrazovku, ale také na ni přenést data. Například uživatelské jméno. V tomto případě musíte použít speciální oblast extraData které třída má Úmysl.

Kraj extraData je seznam párů klíč / hodnota který je předán spolu se záměrem. Řetězce se používají jako klíče a pro hodnoty můžete použít jakékoli primitivní datové typy, pole primitiv, objekty tříd Svazek atd.

Chcete-li přenést data do jiné aktivity, použijte metodu putExtra ():

Intent.putExtra ("Klíč", "Hodnota");

Přijímací aktivita by měla volat nějakou vhodnou metodu: getIntExtra (), getStringExtra () atd.:

Počet int = getIntent (). GetIntExtra ("název", 0);

Zopakujme předchozí příklad. Máme za sebou již tři aktivity. První aktivita bude mít dvě textová pole a tlačítko. Vzhled může být následující:

Druhá činnost Druhá aktivita nainstalujte prvek TextView, ve kterém zobrazíme text přijatý z první aktivity. Pojďme napsat následující kód pro metodu onCreate () při druhé aktivitě.

@Override protected void onCreate (Bundle savedInstanceState) (super.onCreate (savedInstanceState); setContentView (R.layout.activity_second); String user = "Live"; String gift = "díra v koblihu"; TextView infoTextView = (TextView) findViewById R. id.textViewInfo); infoTextView.setText (uživatel + ", dostali jste" + dárek);)

Pokud nyní spustíme program a pouze vyvoláme druhé okno, jak je popsáno v první části článku, uvidíme výchozí označení Zhivotnoe, dostal jsi díru na koblihu... Souhlas, je docela škoda takové zprávy dostávat.

Opravujeme situaci. Přidejte kód pro první aktivitu:

Public void onClick (Zobrazit zobrazení) (EditText userEditText = (EditText) findViewById (R.id.editTextUser); EditText giftEditText = (EditText) findViewById (R.id.editTextGift); Intent intent = nová třída Intent (SecondActivity); / / vloží text z prvního textového pole do klíče uživatelského jména intent.putExtra („uživatelské jméno“, userEditText.getText (). toString ()); // vloží text z druhého textového pole do dárkového klíče intent.putExtra ( "gift ", giftEditText.getText (). toString ()); startActivity (záměr);)

Předmět jsme umístili do speciálního kontejneru Úmysl dva klíče s hodnotami převzatými z textových polí. Když uživatel zadá data do textových polí, přejde do tohoto kontejneru a bude převeden do druhé aktivity.

Druhá aktivita by měla být připravena přijímat teplé zprávy následovně (tučně).

// Výchozí hodnoty ​​String user = "Live"; String gift = "díra na koblihu"; uživatel = getIntent (). getExtras (). getString ("uživatelské jméno"); dárek = getIntent (). getExtras (). getString ("dárek"); TextView infoTextView = (TextView) findViewById (R.id.textViewInfo); infoTextView.setText (uživatel + ", dostali jste" + dárek);

Nyní zpráva nevypadá tak urážlivě, ale pro některé lidi dokonce příjemně. Ve složitých příkladech je žádoucí přidat validaci při zpracování dat. Jsou situace, kdy zahájíte druhou aktivitu s prázdnými daty jako nula což by mohlo způsobit pád aplikace.

V našem případě víme, že čekáme na hodnotu řetězce, takže kód lze přepsat takto:

Záměr záměr = getIntent (); user = intent.getStringExtra ("uživatelské jméno");

Uživatel = getIntent (). GetStringExtra ("uživatelské jméno");

Program má nevýhodu - není jasné, od koho dostáváme pozdravy. Žádná dobře vychovaná opice nepřijme dar od anonymního zdroje. Takže jako domácí úkol přidejte další textové pole pro zadání jména uživatele, který zprávu posílá.

Google doporučuje používat pro klíče následující formát: název vašeho balíčku jako předponu a za ním samotný klíč. V tomto případě si můžete být jisti, že klíč je jedinečný při interakci s jinými aplikacemi. Něco takového:

Veřejný konečný statický řetězec USER = "ru.alexanderklimov.myapp.USER";

Kdo zarámoval kočku Vasku - vracíme výsledek

Ne vždy stačí pouze předat data jiné činnosti. Někdy chcete získat informace zpět z jiné aktivity, když ji zavřete. Pokud jsme dříve použili metodu startActivity (záměr), pak existuje příbuzná metoda startActivityForResult (záměr záměru, int kód požadavku)... Rozdíl mezi metodami je extra parametr Požadovat kód... Je to v podstatě jen celé číslo, které si můžete vytvořit sami. Je potřeba, aby bylo možné rozlišit, od koho výsledek přišel. Řekněme, že máte pět dalších obrazovek a přiřadíte jim hodnoty od 1 do 5 a z tohoto kódu můžete určit, čí výsledek potřebujete zpracovat. Můžete použít hodnotu -1, pak to bude stejné jako při volání metody startActivity (), tj. nedosáhneme žádného výsledku.

Pokud použijete metodu startActivityForResult (), pak musíte přepsat metodu v kódu, abyste získali výsledek onActivityResult () a zpracovat výsledek. Zmatený? Vezměme si příklad.

Předpokládejme, že jste detektiv. Objevily se informace, že v restauraci byly ze stolu vlivné osoby odcizeny dva kusy klobásy a další produkty. Podezření padlo na tři podezřelé - vránu, zasraného pejska a kočku Vasku.

Jeden z návštěvníků poskytl sérii fotografií ze svého poníka iPhone:


Existuje také svědectví dalšího svědka: A Vaska poslouchá, ale jí.

Vytvořte nový projekt Sherlock se dvěma aktivitami. Na první obrazovce bude tlačítko pro přepnutí na druhou obrazovku a textový popisek, ve kterém bude zobrazeno jméno zloděje.