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
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 12x (2.39 MB)
Aplikace je včetně zdrojových kódů v jazyce Java