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:

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:

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:

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:

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:

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

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é 13x (2.39 MB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

