Intent Filter: co to je, jak funguje a používá se ve vývoji

Autor: IT Sectr Publikováno: 2026-05-14 Doba čtení: 8 min

Intent Filter je deklarativní prohlášení v AndroidManifest.xml, které systému sděluje, jaké implicitní záměry může komponenta aplikace zpracovávat. Podle Android Developer Guide filtr obsahuje action, category a data, na jejichž základě systém směruje volání z jiných aplikací a systémových událostí. Vývoj pro Android používá Intent Filter jako hlavní mechanismus volné vazby mezi komponentami různých aplikací.

Hlavní body

  • Intent Filter — XML deklarace v manifestu, která určuje typy implicitních Intent, které může Activity, Service nebo BroadcastReceiver zpracovávat.
  • Action určuje akci, kterou má komponenta provést — například ACTION_VIEW pro zobrazení dat nebo ACTION_SEND pro odeslání obsahu.
  • Category definuje dodatečnou kategorii komponenty — BROWSABLE umožňuje volání z prohlížeče, DEFAULT je vyžadována pro implicitní Intent.
  • Data popisuje URI, MIME typ nebo schéma zpracovávaných dat, což je kriticky důležité pro nastavení deep link v aplikaci.
  • Konflikty při existenci více aplikací zpracovávajících stejný Intent jsou řešeny systémovým dialogem výběru nebo výchozím nastavením.

Co je Intent Filter?

Intent Filter je konfigurační prvek aplikace pro Android, který informuje systém o možnosti komponenty zpracovávat určité typy implicitních záměrů. Na rozdíl od explicitních Intent, které určují konkrétní třídu, implicitní Intent obsahují pouze popis požadované akce a systém sám najde vhodnou komponentu na základě registrovaných filtrů.

Filtry jsou deklarovány uvnitř komponenty — Activity, Service nebo BroadcastReceiver — v souboru AndroidManifest.xml. Každý filtr může obsahovat několik prvků action, category a data. Komponenta může mít neomezený počet Intent Filter, přičemž každý popisuje samostatný scénář zpracování.

Role v architektuře Android

Intent Filter implementuje princip volné vazby mezi komponentami aplikací. Aplikace A nemusí vědět o existenci aplikace B — pouze odešle Intent s popisem akce a systém jej směruje na základě filtrů. Tento mechanismus je základem Share Sheet, výběru prohlížeče a zpracování deep link.

Typy Intent: explicitní a implicitní

Explicitní Intent určují konkrétní třídu komponenty ke spuštění. Používají se pro interní navigaci v rámci jedné aplikace, když vývojář přesně ví, které Activity se má otevřít. Implicitní Intent obsahují pouze popis akce a komponenta je určena systémem dynamicky.

Intent Filter pracuje výhradně s implicitními Intent. Pokud je v Intent uvedena konkrétní třída, systém ignoruje všechny filtry a spouští určenou komponentu přímo. Filtry se kontrolují pouze při řešení implicitních volání, což je činí klíčovým prvkem meziaplikační komunikace.

Srovnání explicitních a implicitních Intent

VlastnostExplicitní IntentImplicitní Intent
KomponentaUrčena explicitně (className)Určena systémem
Intent FilterNení vyžadovánVyžadován
PříkladstartActivity(Intent(this, ProfileActivity::class.java))Intent(ACTION_VIEW, Uri.parse(„https://example.com“))
BezpečnostVyšší (bez odposlechu)Nižší (možné konflikty)

Struktura Intent Filter v manifestu

Každý Intent Filter se skládá ze tří skupin prvků — action, category a data — jejichž kombinace určuje, které Intent bude komponenta přijímat. Filtr je považován za splněný, pokud Intent odpovídá alespoň jednomu prvku z každé skupiny.

Action popisuje prováděnou akci — zobrazení, úpravu, odeslání. Category přidává dodatečný kontext zpracování — například možnost spuštění z prohlížeče. Data určuje formát zpracovávaných informací pomocí URI nebo MIME typu.

Prvky tagu intent-filter

Příklad Intent Filter pro Activity otevírající odkazy na profily uživatelů. Filtr zahrnuje všechny tři skupiny prvků pro přesné směrování.

xml
<activity android:name=".ProfileActivity">
    <intent-filter>
        <action
            android:name="android.intent.action.VIEW" />
        <category
            android:name="android.intent.category.DEFAULT" />
        <category
            android:name="android.intent.category.BROWSABLE" />
        <data
            android:scheme="myapp"
            android:host="profile" />
    </intent-filter>
</activity>

Všimněte si povinného uvedení category DEFAULT — bez něj systém nebude komponentě předávat implicitní Intent. Kategorie BROWSABLE se přidává, pokud má být odkaz zpracováván z prohlížeče.

Deep link na Androidu se nastavuje pomocí Intent Filter s action VIEW a tagem data obsahujícím schéma, host a cestu. Při přechodu na odkaz tvaru myapp://profile/42 systém najde Activity s odpovídajícím filtrem a spustí ji s předaným URI. Je důležité správně nastavit pathPrefix, pathPattern nebo path pro přesné přiřazení.

Od Androidu 6 (API 23) je podporováno App Links — ověřené deep linky přes HTTPS. Pro App Links se používá stejný Intent Filter, ale s dodatečným ověřením domény přes Digital Asset Links. Po ověření systém automaticky otevře aplikaci bez dialogu výběru.

Data tag pro URL

Příklad filtru pro App Link s ověřením pomocí HTTPS odkazu. V tomto případě je schéma vždy https a host odpovídá doméně uvedené v Digital Asset Links.

xml
<intent-filter android:autoVerify="true">
    <action
        android:name="android.intent.action.VIEW" />
    <category
        android:name="android.intent.category.DEFAULT" />
    <category
        android:name="android.intent.category.BROWSABLE" />
    <data
        android:scheme="https"
        android:host="example.com"
        android:pathPrefix="/profile" />
</intent-filter>

Atribut autoVerify instruuje systém, aby zkontroloval Digital Asset Links při instalaci aplikace. Pokud je ověření úspěšné, aplikace se automaticky stane výchozím zpracovatelem pro určenou doménu a cesty.

Zpracování Intent v komponentách aplikace

Poté, co systém vybral komponentu pro zpracování Intent, musí vývojář extrahovat data z příchozího záměru uvnitř cílové komponenty. Pro Activity se používá metoda getIntent() v onCreate(), pro BroadcastReceiver metoda onReceive(), kde je Intent předán jako parametr.

Extrakce dat zahrnuje získání action pro určení typu operace, data pro URI a extra parametrů pro dodatečné informace. Každý z těchto prvků může chybět, proto je nutná kontrola na null před použitím.

Kód zpracování v Activity

Příklad zpracování příchozího deep linku v Activity v Kotlinu. Kód extrahuje URI z Intent a na základě hosta a cesty rozhoduje o navigaci.

kotlin
class ProfileActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val uri = intent?.data
        if (uri?.host == "profile") {
            val userId = uri.lastPathSegment
            loadProfile(userId)
        }
    }
}

Doporučuje se používat safe call operator pro kontrolu intent a data na null, protože aktivita může být spuštěna bez příchozího deep linku. Také je třeba kontrolovat host a pathSegment na null před jejich použitím v navigaci.

Priorita a řešení konfliktů

Pokud několik aplikací zaregistrovalo Intent Filter odpovídající stejnému implicitnímu Intent, systém zobrazí uživateli dialog výběru. Uživatel může vybrat aplikaci pro jednorázové použití nebo nastavit výchozího zpracovatele. Od Androidu 10 se dialog výběru zobrazuje pouze při prvním volání, poté si systém zapamatuje volbu uživatele.

Pro řízení priority se používá atribut android:priority v tagu intent-filter. Čím vyšší hodnota, tím vyšší prioritu má komponenta při řešení konfliktů. Priorita však nefunguje pro filtry z různých aplikací — v tomto případě se vždy zobrazí dialog výběru, pokud není žádná aplikace nastavena jako výchozí.

Dialog výběru aplikace

Vývojář může programově vyvolat dialog výběru pomocí Intent.createChooser() s předáním cílového Intent a nadpisu. To je užitečné, když aplikace chce explicitně nabídnout uživateli výběr zpracovatele, i když je nastavena výchozí aplikace. Například při odesílání obrázků do sociálních sítí přes ACTION_SEND createChooser zaručuje zobrazení dialogu bez ohledu na výchozí nastavení.

Typické chyby při nastavení Intent Filter

Jednou z nejčastějších chyb je chybějící kategorie DEFAULT v Intent Filter. Vývojáři kopírují konfiguraci z příkladů, ale zapomenou přidat tuto kategorii, v důsledku čehož Activity nepřijímá implicitní Intent. Systém jednoduše nevidí filtr pro implicitní volání, i když explicitní Intent nadále fungují.

Druhou častou chybou je nesprávné uvedení scheme v tagu data bez úplného URI. Pokud je uvedeno pouze schéma, ale není uveden host, filtr bude přijímat všechny odkazy s tímto schématem z jakéhokoli zdroje, což může vést k nežádoucím voláním z neověřených zdrojů. Doporučuje se vždy uvádět alespoň schéma a host.

Třetí chybou je chybějící kontrola intent.data na null v kódu Activity. Pokud je Activity spuštěna nikoli přes deep link, ale standardním způsobem z launcheru, Intent neobsahuje URI. Přístup k intent.data bez kontroly způsobí NullPointerException a pád aplikace. Vždy používejte intent?.data?.toString() s operátorem safe call.

Často kladené otázky

Je povinné uvádět category DEFAULT v Intent Filter?

Ano, pro příjem implicitních Intent je kategorie DEFAULT povinná. Bez ní systém nebude komponentě předávat implicitní volání a Intent Filter bude fungovat pouze pro explicitní Intent, které stejně filtry nekontrolují.

Kolik Intent Filter může mít jedno Activity?

Neexistují žádná omezení. Jedno Activity může obsahovat libovolný počet Intent Filter. Každý filtr popisuje samostatný scénář zpracování, například jeden filtr pro deep link, druhý pro zpracování souborů, třetí pro Share Sheet.

Čím se liší Intent Filter od App Link?

Intent Filter je obecný mechanismus pro zpracování implicitních Intent. App Link je zvláštní případ Intent Filter s ověřením přes Digital Asset Links, který automaticky nastaví aplikaci jako výchozího zpracovatele pro HTTPS odkazy na určené doméně.

Lze použít Intent Filter pro Service nebo BroadcastReceiver?

Ano, Intent Filter lze deklarovat nejen pro Activity, ale také pro Service a BroadcastReceiver. Pro Service to umožňuje spouštět službu na pozadí z jiných aplikací, pro BroadcastReceiver — přijímat systémová vysílání.

Jak Intent Filter zpracovává MIME typy?

MIME typ se uvádí v tagu data pomocí atributu mimeType. Filtr určuje, jaké typy dat může komponenta zpracovávat — například image/* pro všechny obrázky nebo text/plain pouze pro prostý text. MIME typy lze kombinovat se schématy URI.

Shrnutí

  • Intent Filter — XML deklarace v AndroidManifest.xml, která určuje, jaké implicitní Intent může komponenta aplikace zpracovávat.
  • Tři skupiny — action (akce), category (kategorie), data (URI a MIME) tvoří filtr; komponenta přijímá Intent, pokud odpovídají všechny uvedené skupiny.
  • Deep link se nastavuje pomocí action VIEW a tagu data se schématem, hostem a cestou, volitelně s autoVerify pro App Links.
  • App Links — ověřené HTTPS odkazy přes Digital Asset Links, které nevyžadují dialog výběru aplikace.
  • Konflikty při shodě více filtrů se řeší systémovým dialogem nebo prioritou pro komponenty jedné aplikace.
  • Zpracování příchozího Intent se provádí přes intent.data v Activity nebo onReceive v BroadcastReceiver s povinnou kontrolou na null.
  • Použití — Intent Filter se využívá pro meziaplikační komunikaci, zpracování odkazů, souborů a systémových událostí.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také