Pro správné přehrávání zvuku v Android aplikacích je nezbytné porozumět několika klíčovým aspektům správy MediaPlayeru a interakce s hardwarem zařízení. Při jednoduchých ukázkách, jako je přehrávání krátkých zvukových souborů, lze často použít hlavní uživatelský (UI) thread, protože zpracování je rychlé a nezpůsobuje znatelné zpoždění. V praxi je však lepší, zejména u delších nebo složitějších médií, využívat asynchronní přípravu pomocí metody prepareAsync(). Ta umožňuje připravit MediaPlayer na přehrávání bez blokování UI threadu, čímž zajišťuje plynulý chod aplikace. V příkladu je proto doporučeno nastavit posluchač OnPreparedListener, který spustí přehrávání hned po dokončení přípravy.

Pokud vytváříte přehrávač hudby, který má fungovat i na pozadí, je nutné přesunout MediaPlayer z aktivity do služby (Service). Služba totiž umožní přehrávání i v okamžiku, kdy uživatel přepne na jinou aplikaci. Přestože služba běží ve stejném vlákně jako UI thread, MediaPlayer interně zvládá zpracování v pozadí, aby nedocházelo k zasekávání uživatelského rozhraní. To však neznamená, že by vývojář neměl být opatrný a nevkládat blokující operace přímo do hlavního vlákna služby.

Dalším důležitým prvkem je správná integrace hardwarových tlačítek, například pro ovládání hlasitosti či přehrávání (play, pause, skip). Pro ovládání hlasitosti v rámci aplikace je doporučeno využít metodu setVolumeControlStream(AudioManager.STREAM_MUSIC), která zajistí, že tlačítka hlasitosti upravují právě zvuk přehrávaný v aplikaci. Pro komplexní práci s hardwarovými mediálními tlačítky slouží MediaSession a kompatibilní třída MediaSessionCompat. Tyto nástroje umožňují aplikaci reagovat na příkazy jako přehrávání, pauza nebo přeskočení skladby. Díky kompatibilní knihovně MediaSessionCompat je možné využívat moderní API i na starších verzích Androidu, což výrazně zjednodušuje vývoj a zajišťuje lepší uživatelský zážitek.

Implementace tohoto ovládání spočívá v vytvoření zpětného volání (callback), které reaguje na příslušné události, nastavení příznaků, které říkají systému, že aplikace chce zachytávat mediální tlačítka, a aktivaci této relace. Dále je třeba specifikovat, jaké akce budou podporovány, například play, pause, skip to next a skip to previous. Tímto způsobem je možné nejen zachytávat stisknutí tlačítek, ale také dynamicky měnit stav přehrávání v závislosti na uživatelských interakcích.

Důležité je rovněž správně detekovat aktuální výstupní zařízení pro zvuk, například zda je aktivní Bluetooth, reproduktory, nebo drátová sluchátka. To umožňuje aplikaci přizpůsobit chování a kvalitu zvuku podle konkrétního hardwaru, což může zlepšit uživatelský komfort a zároveň šetřit zdroje zařízení. K tomuto účelu slouží metody AudioManageru, jako jsou isBluetoothA2dpOn(), isSpeakerphoneOn() nebo isWiredHeadsetOn().

MediaPlayer a související API tak představují robustní nástroje pro práci s audio obsahem v Androidu, avšak jejich správné využití vyžaduje znalost asynchronního programování, správného nastavení životního cyklu komponent a detailní práci s hardwarem zařízení. Tímto způsobem lze vytvořit plynulé, spolehlivé a uživatelsky přívětivé aplikace pro přehrávání zvuku v různých situacích, ať už se jedná o jednoduché efekty nebo komplexní hudební přehrávače běžící i na pozadí.

Je třeba si uvědomit, že audio přehrávání v mobilních aplikacích je silně závislé na správném řízení životního cyklu komponent a správě systémových zdrojů. Neefektivní správa může vést k úniku paměti, přerušení zvuku nebo dokonce k pádům aplikace. Proto je nezbytné uvolňovat prostředky MediaPlayeru v odpovídajících metodách životního cyklu, jako je například onStop(). Rovněž je důležité zajistit správnou synchronizaci mezi UI a background tasky, aby uživatelské rozhraní reagovalo bez zbytečných prodlev či zaseknutí.

Kromě technických aspektů je také zásadní zaměřit se na uživatelskou zkušenost – intuitivní ovládání hlasitosti, bezproblémová reakce na hardwarová tlačítka a schopnost přehrávání na pozadí výrazně zvyšují hodnotu aplikace v očích uživatelů. Vývojář by měl proto pečlivě zvážit, jaká řešení a knihovny využije, a vždy testovat aplikaci na různých zařízeních a verzích operačního systému, aby zajistil maximální kompatibilitu a stabilitu.

Jak zobrazit webovou stránku ve vaší aplikaci a monitorovat online stav

V moderních aplikacích pro Android je často potřeba nejen zobrazit obsah z webu, ale také kontrolovat připojení k internetu a typ tohoto připojení, ať už jde o WiFi, mobilní data nebo jiné technologie. V této kapitole se zaměříme na dvě klíčové oblasti: zobrazení webových stránek v aplikaci a kontrolu stavu připojení k

Jak nastavit a spravovat alarmy v Android aplikaci

Vytváření alarmů v Android aplikacích může být velmi užitečné pro různé účely – od připomínek po spouštění periodických úkolů. Použití správného nástroje pro tuto funkci, tedy třídy AlarmManager, je klíčové pro efektivní fungování aplikace. Tento text ukazuje, jak nastavit a spravovat alarmy v Android aplikacích, a vysvětluje, jak se s těmito alarmy správně zacházet při restartu zařízení nebo při opětovném spuštění aplikace.

Pro nastavení alarmu je potřeba využít třídu PendingIntent, která se používá k odeslání záměru (intent) v okamžiku, kdy alarm vyprší. Tento záměr musí být zachycen pomocí BroadcastReceiver, který bude následně reagovat na vyvolaný alarm. Vytvoření alarmu v aplikaci začíná deklarováním požadovaného BroadcastReceiver v manifestu aplikace. Tento receiver zachytí alarmovou akci, jakmile alarm vyprší, a umožní aplikaci reagovat (například zobrazit toastovou zprávu).

Příklad implementace:

  1. Do souboru AndroidManifest.xml přidáte následující kód pro zajištění přístupu k požadované akci alarmu:

    xml
    <receiver android:name=".AlarmBroadcastReceiver"/>
  2. Dále vytvoříte jednoduché uživatelské rozhraní se základním tlačítkem pro nastavení alarmu:

    xml
    <Button android:id="@+id/set_alarm_button" android:text="Set Alarm"/>
  3. Poté vytvoříte třídu AlarmBroadcastReceiver, která bude zpracovávat alarm, jakmile dojde k jeho aktivaci:

    java
    public class AlarmBroadcastReceiver extends BroadcastReceiver {
    public static final String ACTION_ALARM = "com.example.alarm.ACTION_ALARM"; @Override public void onReceive(Context context, Intent intent) { if (ACTION_ALARM.equals(intent.getAction())) { Toast.makeText(context, "Alarm Triggered!", Toast.LENGTH_SHORT).show(); } } }
  4. V souboru ActivityMain.java implementujete metodu pro nastavení alarmu, která bude reagovat na stisk tlačítka a spustí alarm za 30 minut:

    java
    public void setAlarm(View view) {
    Intent intentToFire = new Intent(getApplicationContext(), AlarmBroadcastReceiver.class); intentToFire.setAction(AlarmBroadcastReceiver.ACTION_ALARM);
    PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intentToFire, 0);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); long thirtyMinutes = SystemClock.elapsedRealtime() + 30 * 60 * 1000; alarmManager.set(AlarmManager.ELAPSED_REALTIME, thirtyMinutes, alarmIntent); }
  5. Po spuštění aplikace a nastavení alarmu se po uplynutí 30 minut zobrazí toastová zpráva, což je jednoduchý způsob ověření, že alarm funguje správně.

V případě, že chcete mít možnost zrušit alarm, můžete využít metodu cancel(), která zruší jakýkoli alarm, pokud je použit stejný PendingIntent jako při jeho nastavení. K tomu slouží tento kód:

java
alarmManager.cancel(alarmIntent);

Pokud byste potřebovali opakující se alarm, můžete použít metodu setRepeating(), která umožňuje nastavit alarm s intervalem, jak ukazuje následující kód:

java
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, thirtyMinutes, interval, alarmIntent);

Kde interval je čas mezi opakovanými alarmy v milisekundách. K dispozici jsou i předdefinované konstanty, jako například INTERVAL_DAY nebo INTERVAL_HOUR, pro nastavení běžných časových intervalů.

Pokud aplikace potřebuje vědět, kdy bylo zařízení restartováno, je možné zachytit BOOT_COMPLETED akci, která je odeslána po restartu zařízení. Pro tento účel je třeba nastavit příslušná oprávnění v manifestu a vytvořit BroadcastReceiver, který tuto akci zachytí:

xml
<receiver android:name=".BootBroadcastReceiver" android:enabled="true" android:exported="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>

A následně v BroadcastReceiveru zachytíte tuto akci:

java
public class BootBroadcastReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { Toast.makeText(context, "Device Booted", Toast.LENGTH_SHORT).show(); } } }

Tento mechanismus je nezbytný pro správné zajištění, že vaše aplikace obnoví potřebné alarmy po restartu zařízení. Samozřejmě, že v reálné aplikaci byste místo toastové zprávy přidali logiku pro znovuobnovení alarmů nebo jiných důležitých funkcí.

Pokud budete potřebovat více než jeden typ alarmu nebo akce, není nutné vytvářet pro každý typ zvláštní BroadcastReceiver. Můžete ve své metodě onReceive jednoduše kontrolovat více akcí a podle potřeby reagovat na každou z nich.

Je důležité mít na paměti, že od verze Android 4.4 (KitKat, API 19) Android považuje alarmy nastavené metodou set() za inexactní (přesné časy již nejsou garantovány), pokud požadujete přesný čas, doporučuje se používat metodu setExact(). To znamená, že i když bude alarm nastaven na určitou časovou hodnotu, systém může alarm aktivovat s malým zpožděním kvůli optimalizacím baterie.