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 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í.
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.
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.
| Vlastnost | Explicitní Intent | Implicitní Intent |
|---|---|---|
| Komponenta | Určena explicitně (className) | Určena systémem |
| Intent Filter | Není vyžadován | Vyžadován |
| Příklad | startActivity(Intent(this, ProfileActivity::class.java)) | Intent(ACTION_VIEW, Uri.parse(„https://example.com“)) |
| Bezpečnost | Vyšší (bez odposlechu) | Nižší (možné konflikty) |
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.
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í.
<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.
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.
<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.
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.
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.
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.
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í.
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í.
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
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í.
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.
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ě.
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í.
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í
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í.
Přečtěte si také