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