Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 50% výuky zdarma!
Pouze tento týden sleva až 80 % na e-learning týkající se Javy
Discount week - May - 50

Lekce 1 - Android Intenty a aktivity - Úvod a hlavní aktivita

Pojem Aktivita již jistě dobře znáte. V následujícím Android kurzu si ukážeme otevírání více aktivit a použití vybraných intentů některých nejběžnějších akcí v systému Android. Provázet nás bude ukázková aplikace. Ukážeme si mimo jiné oboustrannou komunikaci dvou aktivit a jak se pracuje se systémovými aktivitami, jako např. zeměpisnými souřadnicemi, fotoaparátem nebo otevřením webu. Pracovat budeme tedy hojně s objekty typu Intent.

Protože je v kurzu ve dvou případech nutné požádat uživatele o udělení určitých oprávnění, přidal jsem ještě menší kurz o oprávněních aplikací. Znalost této problematiky také považuji za důležitou. Původně jsem chtěl oprávnění ve zkratce představit přímo zde v kurzu o intentech, ale nakonec jsem zjistil, že veškerou problematiku nejde udělat jen "ve zkratce". Na kurz se ještě znovu odkážeme, až bude potřeba.

Příklad

V Android Studiu vytvoříme projekt s názvem Activities. Ten bude provádět následujících 6 činností:

  • Aktivita SumActivity - Součet čísel
  • Aktivita MapActivity - Zobrazení mapy
  • Aktivita PhoneActivity - Telefon a SMS
  • Aktivita PhotoActivity - Fotoaparát, Galerie a sdílení fotografie
  • Aktivita ShareActivity - Sdílení textu
  • Otevření webu

Na konci těch lekcí, ve kterých dokončíme některou z aktivit, bude ke stažení projekt a instalační soubor aplikace Activities. Projekt vždy bude obsahovat do té doby přidané funkcionality.

Hlavní aktivita

Hlavní aktivitu Android Studio vygenerovalo při vytvoření projektu. Ta bude obsahovat šest tlačítek, tedy pro každou z výše zmíněných činností aplikace.

Kód hlavní aktivity tedy upravíme tak, aby obsahoval těchto 6 tlačítek:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/bg_activity_main"
    android:padding="10dp"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btnSumActivity"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:onClick="click"
        android:text="@string/activity_main_btn_sum_activity"
        android:textAllCaps="false"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btnMapActivity"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:onClick="click"
        android:text="@string/activity_main_btn_map_activity"
        android:textAllCaps="false"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btnSumActivity" />

    <Button
        android:id="@+id/btnPhoneActivity"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:onClick="click"
        android:text="@string/activity_main_btn_phone_activity"
        android:textAllCaps="false"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btnMapActivity" />

    <Button
        android:id="@+id/btnPhotoActivity"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:onClick="click"
        android:text="@string/activity_main_btn_photo_activity"
        android:textAllCaps="false"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btnPhoneActivity" />

    <Button
        android:id="@+id/btnShareActivity"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:onClick="click"
        android:text="@string/activity_main_btn_share_activity"
        android:textAllCaps="false"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btnPhotoActivity" />

    <Button
        android:id="@+id/btnITnetwork"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:onClick="click"
        android:text="@string/activity_main_btn_itnetwork"
        android:textAllCaps="false"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btnShareActivity" />

</androidx.constraintlayout.widget.ConstraintLayout>

Konstanty použitých textů

Soubor res/values/strings.xml doplníme o následující položky s texty použitými v XML návrhu hlavní aktivity MainActivity:

<string name="app_name">Activities</string>

<string name="activity_main_title">Hlavní aktivita</string>

<string name="activity_main_btn_sum_activity">Součet čísel</string>
<string name="activity_main_btn_map_activity">Zobrazení mapy</string>
<string name="activity_main_btn_phone_activity">Telefon a SMS</string>
<string name="activity_main_btn_photo_activity">Fotoaparát, Galerie a sdílení fotografie</string>
<string name="activity_main_btn_share_activity">Sdílení textu</string>
<string name="activity_main_btn_itnetwork">ITnetwork.cz (otevření webu)</string>

<string name="info_finish_app">Pro ukončení aplikace stiskněte ZPĚT znovu</string>

Konstanty použitých barev

Podobně doplníme soubor res/values/colors.xml o jednu položku s barvou pozadí hlavní aktivity:

<color name="bg_activity_main">#D9FBFF</color>

V editoru v záložce Design uvidíme tento výsledek:

Popis funkcí aplikace

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Jelikož aplikace nám vydrží po celý kurz, pojďme si popsat, jak budou její budoucí funkce vypadat a pracovat.

Aktivita SumActivity

Zde zadáme dvě čísla a tlačítkem otevřeme další aktivitu, kde bude zobrazen jejich součet. Odsud výsledek výpočtu odešleme zpět do Aktivity SumActivity:

Tento příklad ukazuje oboustrannou komunikaci dvou aktivit.

Aktivita MapActivity

Zde nastavíme zeměpisné souřadnice, které tlačítkem odešleme systému pro zobrazení polohy v mapách:

Aktivita PhoneActivity

Ukážeme si systémové aktivity pro vytáčení telefonních hovorů a odesílání SMS. Zadáme telefonní číslo, na které můžeme zatelefonovat nebo odeslat SMS:

Aktivita PhotoActivity

Požádáme systém o otevření systémové aktivity s fotoaparátem a také pořízenou fotografii zpracujeme a zobrazíme v komponentě ImageView. Nebo budeme moci vybrat obrázek z fotogalerie zařízení. Vybraný obrázek nebo pořízenou fotografii můžeme sdílet odesláním do jiné aplikace:

Aktivita ShareActivity

Zde si předvedeme odeslání požadavku na sdílení textu, zadaného do textového pole:

Aktivita ITnetwork

Kliknutím na toto tlačítko bude systému odeslán požadavek na zobrazení nabídky aplikací vhodných k zobrazení webu. Pokud je taková aplikace v zařízení jen jedna, bude rovnou otevřena tato jediná aplikace.

MainActivity.java

Uveďme si kód hlavní aktivity MainActivity.java:

public class MainActivity extends AppCompatActivity {

    long backPressedTime = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle(R.string.activity_main_title);
    }

    public void click(View view) {
        switch (view.getId()) {
            case R.id.btnSumActivity:
                break;
            case R.id.btnMapActivity:
                break;
            case R.id.btnPhoneActivity:
                break;
            case R.id.btnPhotoActivity:
                break;
            case R.id.btnShareActivity:
                break;
            case R.id.btnITnetwork:
                Intent webIntent = new Intent(Intent.ACTION_VIEW);
                webIntent.setData(Uri.parse("https://www.itnetwork.cz/"));

                if (webIntent.resolveActivity(getPackageManager()) != null) {
                    startActivity(webIntent);
                }
                break;
        }
    }

    @Override
    public void onBackPressed() {
        long actualTime = new Date().getTime();
        long difference = actualTime - backPressedTime;

        if (difference < 3000) {
            super.onBackPressed();
        } else {
            backPressedTime = new Date().getTime();
            Toast.makeText(MainActivity.this, R.string.info_finish_app, Toast.LENGTH_SHORT).show();
        }
    }
}

V metodě onCreate() nastavujeme voláním setContentView() vzhled GUI a voláním setTitle() nastavujeme text zobrazený v toolbaru aplikace.

V XML návrhu má každý element <Button> atribut android:onClick="click", jehož hodnotou je název metody, která obsluhuje událost kliknutí. Je to metoda click(), kterou v MainActivity.java deklarujeme a která v parametru přijímá objekt typu View. Při volání této metody je v tomto parametru reference na element, na kterém k události došlo. V click() pak konstrukce switch podle ID tohoto elementu vykoná akci pro dané tlačítko.

Prvních pět tlačítek otevírá další aktivity, které postupně vytvoříme později a jednotlivé větve switch doplníme potřebným kódem. Šesté tlačítko neotevírá žádnou naši aktivitu, ale žádá systém o spuštění nějaké nainstalované aplikace, která umí zobrazit web (nějaký internetový prohlížeč).

K odesílání požadavků na otevírání jiných aktivit se používají objekty třídy Intent. S intenty se blíže seznámíme v následující lekci.

Obsloužení události kliknutí je možné několika způsoby, které různě prostřídáme v dalších našich aktivitách a u každého způsobu zmíníme jeho výhody a nevýhody.

Na konci kódu přepisujeme metodu onBackPressed(), která je volána v zobrazené aktivitě při stisknutí tlačítka Zpět. Toho využijeme k tomu, že aplikace nebude zavírána prvním stisknutím tlačítka Zpět, ale až druhým, pokud bude provedeno v nastavené časové prodlevě po prvním stisku.

Níže naleznete soubor s projektem. Zatím obsahuje pouze hlavní aktivitu. V hlavní aktivitě je funkční pouze poslední tlačítko pro otevření webu ITnetwork.

V příští lekci, Android Intenty a aktivity - SumActivity - Součet čísel, zprovozníme první tlačítko a začneme s ukázkou obousměrné komunikace mezi dvěma aktivitami :)


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 2x (16.61 MB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Všechny články v sekci
Android Intenty a aktivity
Článek pro vás napsal Pavel
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Autor se věnuje programování v Javě, hlavně pro Android. Mezi jeho další zájmy patří Arduino, Minecraft.
Aktivity (8)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!