September discount week
Tento týden až 80% sleva na e-learning týkající se jazyka C
50 % bodů zdarma na online výuku díky naší Slevové akci!

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 A - Součet čísel
  • Aktivita B - Zobrazení mapy
  • Aktivita C - Telefon a SMS
  • Aktivita D - Fotoaparát, Galerie a sdílení fotografie
  • Aktivita E - Sdílení textu
  • Otevření webu

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:

<?xml version="1.0" encoding="utf-8"?>
<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/btnA"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:onClick="click"
        android:text="@string/activity_main_btn_a"
        android:textAllCaps="false"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

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

    <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/btnE" />

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

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

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

</androidx.constraintlayout.widget.ConstraintLayout>

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

Popis funkcí aplikace

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

Aktivita A

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 A:

Tento příklad ukazuje oboustrannou komunikaci dvou aktivit.

Aktivita B

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

Aktivita C

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 D

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 E

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.btnA:
                Intent intentA = new Intent(MainActivity.this, ActivityA.class);
                startActivity(intentA);
                break;
            case R.id.btnB:
                Intent intentB = new Intent(MainActivity.this, ActivityB.class);
                startActivity(intentB);
                break;
            case R.id.btnC:
                Intent intentC = new Intent(MainActivity.this, ActivityC.class);
                startActivity(intentC);
                break;
            case R.id.btnD:
                Intent intentD = new Intent(MainActivity.this, ActivityD.class);
                startActivity(intentD);
                break;
            case R.id.btnE:
                Intent intentE = new Intent(MainActivity.this, ActivityE.class);
                startActivity(intentE);
                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. Š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.

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


 

Všechny články v sekci
Android Intenty a aktivity
Článek pro vás napsal lupa.lupa
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Aktivity (3)

 

 

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í!