IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

1. diel - Android Intent a aktivity - Úvod a hlavné aktivita

Pojem Aktivita už iste dobre poznáte. V nasledujúcom Android kurze si ukážeme otváranie viacerých aktivít a použitie vybraných Intent niektorých najbežnejších podujatí v systéme Android. Sprevádzať nás bude ukážková aplikácia. Ukážeme si okrem iného obojstrannú komunikáciu dvoch aktivít a ako sa pracuje so systémovými aktivitami, ako napr. Zemepisnými súradnicami, fotoaparátom alebo otvorením webu. Pracovať budeme teda hojne s objektmi typu Intent.

Pretože je v kurze v dvoch prípadoch potrebné požiadať užívateľa o udelenie určitých oprávnenia, pridal som ešte menší kurz o oprávneniach aplikácií. Znalosť tejto problematiky tiež považujem za dôležitú. Pôvodne som chcel oprávnenia v skratke predstaviť priamo tu v kurze o Intent, ale nakoniec som zistil, že celú problematiku nejde urobiť len "v skratke". Na kurz sa ešte znovu odkážeme, až bude potreba.

Príklad

V Android Štúdiu vytvoríme projekt s názvom Activities. Ten bude vykonávať nasledujúcich 6 činností:

  • Aktivita SumActivity - Súčet čísel
  • Aktivita MapActivity - Zobrazenie mapy
  • Aktivita PhoneActivity - Telefón a SMS
  • Aktivita PhotoActivity - Fotoaparát, Galéria a zdieľanie fotografie
  • Aktivita ShareActivity - Zdieľanie textu
  • otvorenie webu

Na konci tých lekcií, v ktorých dokončíme niektorú z aktivít, bude k stiahnutiu projekt a inštalačný súbor aplikácie Activities. Projekt vždy bude obsahovať dovtedy pridanej funkcionality.

Hlavná aktivita

Hlavné aktivitu Android Studio vygenerovalo pri vytvorení projektu. Tá bude obsahovať šesť tlačidiel, teda pre každú z vyššie spomenutých činností aplikácie.

Kód hlavné aktivity teda upravíme tak, aby obsahoval týchto 6 tlačidiel:

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

Konštanty použitých textov

Súbor res/values/strings.xml doplníme o nasledujúce položky s textami použitými v XML návrhu hlavnej 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>

Konštanty použitých farieb

Podobne doplníme súbor res/values/colors.xml o jednu položku s farbou pozadia hlavné aktivity:

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

V editore v záložke Design uvidíme tento výsledok:

Android intent a aktivity

Popis funkcií aplikácie

Keďže aplikácie nám vydrží po celý kurz, poďme si popísať, ako budú jej budúce funkcie vyzerať a pracovať.

Aktivita SumActivity

Tu zadáme dve čísla a tlačidlom otvoríme ďalšiu aktivitu, kde bude zobrazený ich súčet. Odtiaľto výsledok výpočtu odošleme späť do Aktivity SumActivity:

Android intent a aktivity

Tento príklad ukazuje obojstrannú komunikáciu dvoch aktivít.

Aktivita MapActivity

Tu nastavíme zemepisné súradnice, ktoré tlačidlom odošleme systému pre zobrazenie polohy v mapách:

Android intent a aktivity

Aktivita PhoneActivity

Ukážeme si systémové aktivity pre vytáčanie telefónnych hovorov a odosielanie SMS. Zadáme telefónne číslo, na ktoré môžeme zatelefonovať alebo odoslať SMS:

Android intent a aktivity

Aktivita PhotoActivity

Požiadame systém o otvorení systémové aktivity s fotoaparátom a tiež urobenú fotografiu spracujeme a zobrazíme v komponente ImageView. Alebo budeme môcť vybrať obrázok z fotogalérie zariadení. Vybraný obrázok alebo urobenú fotografiu môžeme zdieľať odoslaním do inej aplikácie:

Android intent a aktivity

Aktivita ShareActivity

Tu si predvedieme odoslania požiadavky na zdieľanie textu, zadaného do textového poľa:

Android intent a aktivity

Aktivita ITnetwork

Kliknutím na toto tlačidlo bude systému odoslaný požiadavku na zobrazenie ponuky aplikácií vhodných na zobrazenie webu. Ak je takáto aplikácia v zariadení len jedna, bude rovno otvorená táto jediná aplikácia.

MainActivity.java

Uveďme si kód hlavnej 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 metóde onCreate() nastavujeme volaním setContentView() vzhľad GUI a volaním setTitle() nastavujeme text zobrazený v toolbaru aplikácie.

V XML návrhu má každý element <Button> atribút android:onClick="click", ktorého hodnota je názov metódy, ktorá obsluhuje udalosť kliknutia. Je to metóda click(), ktorú v MainActivity.java deklarujeme a ktorá v parametri prijíma objekt typu View. Pri volaní tejto metódy je v tomto parametri referencie na element, na ktorom k udalosti došlo. V click() potom konštrukcia switch podľa ID tohto elementu vykoná akciu pre dané tlačidlo.

Prvých päť tlačidiel otvára ďalšie aktivity, ktoré postupne vytvoríme neskôr a jednotlivé vetvy switch doplníme potrebným kódom. Šieste tlačidlo neotvára žiadnu našu aktivitu, ale žiada systém o spustenie nejakej nainštalované aplikácie, ktorá vie zobraziť web (nejaký internetový prehliadač).

K odosielanie požiadaviek na otváranie iných aktivít sa používajú objekty triedy Intent. S Intent sa bližšie zoznámime v nasledujúcej lekcii.

Obslúženie udalosti kliknutia je možné niekoľkými spôsobmi, ktoré rôzne prestriedame v ďalších našich aktivitách au každého spôsobu zmienime jeho výhody a nevýhody.

Na konci kódu prepisujeme metódu onBackPressed(), ktorá je volaná v zobrazenej aktivite pri stlačení tlačidla Späť. Toho využijeme na to, že aplikácia nebude zatváraná prvým stlačením tlačidla Späť, ale až druhým, ak bude vykonané v nastavenej časovej odmlke po prvom stlačení.

Nižšie nájdete súbor s projektom. Zatiaľ obsahuje iba hlavné aktivitu. V hlavnej aktivite je funkčné iba posledná tlačidlo pre otvorenie webu ITnetwork.

V budúcej lekcii, Android Intent a aktivity - SumActivity - Súčet čísel , sprevádzkujeme prvé tlačidlo a začneme s ukážkou obojsmernej komunikácie medzi dvoma aktivitami:)


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 12x (2.39 MB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Všetky články v sekcii
Android intent a aktivity
Preskočiť článok
(neodporúčame)
Android Intent a aktivity - SumActivity - Súčet čísel
Článok pre vás napísal Pavel
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje programování v Javě, hlavně pro Android. Mezi jeho další zájmy patří Arduino, Minecraft.
Aktivity