Az Intent Filter egy deklaratív bejelentés az AndroidManifest.xml fájlban, amely jelzi a rendszernek, hogy az alkalmazás mely komponense milyen implicit szándékokat képes kezelni. A Android Developer Guide szerint a filter action, category és data elemeket tartalmaz, amelyek alapján a rendszer útolja a hívásokat más alkalmazásokból és rendszereseményekből. Android-fejlesztés az Intent Filter-t használja a különböző alkalmazások komponensei közötti laza csatolás fő mechanizmusaként.
Főbb pontok
Intent Filter az Android-alkalmazás egy konfigurációs eleme, amely téjékoztatja a rendszert a komponens azon képességéről, hogy bizonyos típusú implicit szándékokat kezeljen. Az explicit Intent-től eltérően, amely egy adott osztályra mutat, az implicit Intent csak a kért művelet leírását tartalmazza, és a rendszer maga találja meg a megfelelő komponenst a regisztrált szűrők alapján.
A szűrők a komponensen belül kerülnek deklarálásra — Activity, Service vagy BroadcastReceiver — az AndroidManifest.xml fájlban. Minden szűrő több action, category és data elemet tartalmazhat. Egy komponens korlátlan számú Intent Filter-rel rendelkezhet, amelyek mindegyike különálló feldolgozási forgatókönyvet ír le.
Az Intent Filter az alkalmazás-komponensek közötti laza csatolás elvét valósítja meg. Az A alkalmazásnak nem kell tudnia a B alkalmazás létezéséről — egyszerűen elküld egy Intent-et a művelet leírásával, és a rendszer a szűrők alapján útolja azt. Ez a mechanizmus képezi a Share Sheet, a böngészőválasztás és a deep link kezelésének alapját.
Az explicit Intent-ek az elindítandó komponens konkrét osztályára mutatnak. Ezeket az egy alkalmazáson belülli belső navigációhoz használják, amikor a fejlesztő pontosan tudja, melyik Activity-nek kell megnyílnia. Az implicit Intent-ek csak a művelet leírását tartalmazzák, és a komponenst a rendszer dinamikusan határozza meg.
Intent Filter kizárólag implicit Intent-ekkel működik. Ha az Intent-ben konkrét osztály van megadva, a rendszer figyelmen kívül hagyja az összes szűrőt, és közvetlenül elindítja a megadott komponenst. A szűrők csak implicit hívások feloldásakor kerülnek ellenőrzésre, ami az alkalmazások közötti interakció kulcselemévé teszi őket.
| Jellemző | Explicit Intent | Implicit Intent |
|---|---|---|
| Komponens | Explicit megadva (className) | A rendszer határozza meg |
| Intent Filter | Nem szükséges | Kötelező |
| Példa | startActivity(Intent(this, ProfileActivity::class.java)) | Intent(ACTION_VIEW, Uri.parse("https://example.com")) |
| Biztonság | Magasabb (nincs elfogás) | Alacsonyabb (lehetséges konfliktusok) |
Minden Intent Filter három elemcsoportból áll — action, category és data — amelyek kombinációja határozza meg, hogy a komponens milyen Intent-eket fogad. A szűrő akkor tekinthető átfutottnak, ha az Intent minden csoport legalább egy elemének megfelel.
Az Action leírja a végrehajtott műveletet — megtekintés, szerkesztés, küldés. A Category további feldolgozási kontextust ad — például a böngészőből történő indítás lehetőségét. A Data URI-n vagy MIME-típuson keresztül határozza meg a feldolgozott információ formátumát.
Példa Intent Filter-re egy olyan Activity számára, amely felhasználói profilokra mutató linkeket nyit meg. A szűrő mindhárom elemcsoportot tartalmazza a pontos útválasztás érdekében.
<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>
Figyeljen a category DEFAULT kötelező megadására — enélkül a rendszer nem továbbítja az implicit Intent-eket a komponensnek. A BROWSABLE kategória akkor kerül hozzáadásra, ha a linket a böngészőből kell feldolgozni.
A deep link Androidon ACTION VIEW-val és a sémát, gazdagépet és útvonalat tartalmazó data címkével ellátott Intent Filter segítségével konfigurálható. Amikor egy myapp://profile/42 alakú linkre kattint, a rendszer megtalálja a megfelelő szűrővel rendelkező Activity-t, és elindítja azt a továbbított URI-val. Fontos a pathPrefix, pathPattern vagy path helyes beállítása a pontos egyezéshez.
Az Android 6-tól (API 23) kezdve megjelent az App Links támogatása — HTTPS-en keresztül hitelesített deep link-ek. Az App Linkekhez ugyanazt az Intent Filter-t használjuk, de a Digital Asset Links-en keresztül történő további domén-hitelesítéssel. A hitelesítés után a rendszer automatikusan megnyitja az alkalmazást választási párbeszédablak nélkül.
Példa szűrőre App Link számára HTTPS-linken keresztül történő hitelesítéssel. Ebben az esetben a séma mindig https, és a gazdagép megegyezik a Digital Asset Links-ben megadott doménnel.
<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>
Az autoVerify attribútom utasítja a rendszert, hogy ellenőrizze a Digital Asset Links-et az alkalmazás telepítésekor. Ha a hitelesítés sikeres, az alkalmazás automatikusan az alapértelmezett kezelővé válik a megadott doménhez és útvonalakhoz.
Miután a rendszer kiválasztotta a komponenst az Intent feldolgozására, a fejlesztőnek ki kell bontania az adatokat a célkomponensen belül a beérkező szándékból. Activity esetén a getIntent() metódus használatos az onCreate()-ben, BroadcastReceiver esetén az onReceive() metódus, ahol az Intent paraméterként kerül átadásra.
Az adatok kinyerése magában foglalja az action lekérését a művelet típusának meghatározásához, a data lekérését az URI-hoz és az extra paraméterek lekérését a kiegészítő információkhoz. Ezen elemek bármelyike hiányozhat, ezért a null-ellenőrzés a használat előtt kötelező.
Példa beérkező deep link feldolgozására egy Activity-ben Kotlin nyelven. A kód kinyeri az URI-t az Intent-ből, és a gazdagép és útvonal alapján navigációs döntést hoz.
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)
}
}
}
Javasolt a safe call operator használata az intent és data null értékének ellenőrzéséhez, mivel az aktivitás beérkező deep link nélkül is elindítható. Szintén ellenőrizni kell a host és pathSegment null értékét a navigációban való használat előtt.
Ha több alkalmazás regisztrált olyan Intent Filter-t, amely megfelel ugyanannak az implicit Intent-nek, a rendszer választási párbeszédablakot jelenít meg a felhasználó számára. A felhasználó kiválaszthatja az alkalmazást egyszeri használatra vagy beállíthat egy alapértelmezett kezelőt. Az Android 10-től kezdve a választási párbeszédablak csak az első hívásnál jelenik meg, ezt követően a rendszer megjegyzi a felhasználó választását.
A prioritás kezeléséhez az android:priority attribútom használható az intent-filter címkében. Minél magasabb az érték, annál nagyobb a komponens prioritása a konfliktusok feloldásakor. Azonban a prioritás nem működik a különböző alkalmazások szűrői esetében — ebben az esetben mindig megjelenik a választási párbeszédablak, ha egyetlen alkalmazás sincs alapértelmezettként beállítva.
A fejlesztő programozottan meghívhatja a választási párbeszédablakot a Intent.createChooser() segítségével, átadva a cél Intent-et és egy címet. Ez akkor hasznos, ha az alkalmazás kifejezetten fel akarja ajánlani a felhasználónak egy kezelő kiválasztását, még akkor is, ha alapértelmezett alkalmazás van beállítva. Például képek közösségi médiába történő küldésekor ACTION_SEND és createChooser segítségével garantálható a párbeszédablak megjelenítése az alapértelmezett beállításoktól függetlenül.
Az egyik leggyakoribb hiba a DEFAULT kategória hiánya az Intent Filter-ből. A fejlesztők példákból másolják a konfigurációt, de elfelejtik hozzáadni ezt a kategóriát, így az Activity nem kap implicit Intent-eket. A rendszer egyszerűen nem látja a szűrőt az implicit hívásokhoz, bár az explicit Intent-ek továbbra is működnek.
A második gyakori hiba a scheme helytelen megadása a data címkében teljes URI nélkül. Ha csak a séma van megadva, de a gazdagép nem, a szűrő minden, ezzel a sémával rendelkező linket elfogad bármilyen forrásból, ami nemkívánt hívásokhoz vezethet nem hitelesített forrásokból. Javasolt mindig legalább a scheme és a host megadása.
A harmadik hiba az intent.data null-ellenőrzésének hiánya az Activity kódjában. Ha az Activity nem deep link-en keresztül, hanem szabványosan az indítóképernyőről indul, az Intent nem tartalmaz URI-t. Az intent.data ellenőrzés nélkül történő elérése NullPointerException-t és az alkalmazás összeomlását okozza. Mindig használja az intent?.data?.toString() metódust a safe call operátorral.
Gyakran Ismételt Kérdések
Igen, az implicit Intent-ek fogadásához a DEFAULT kategória kötelező. Enélkül a rendszer nem továbbítja az implicit hívásokat a komponensnek, és az Intent Filter csak az explicit Intent-ekhez működik, amelyek egyébként sem ellenőrzik a szűrőket.
Nincs korlátozás. Egy Activity tetszőleges számú Intent Filter-t tartalmazhat. Minden szűrő különálló feldolgozási forgatókönyvet ír le, például az egyik szűrő a deep link-hez, a másik a fájlok feldolgozásához, a harmadik a Share Sheet-hez.
Az Intent Filter általános mechanizmus az implicit Intent-ek kezelésére. Az App Link az Intent Filter speciális esete Digital Asset Links-en keresztül történő hitelesítéssel, amely automatikusan kijelöli az alkalmazást alapértelmezett kezelőként a megadott doménen lévő HTTPS-linkek számára.
Igen, az Intent Filter nem csak Activity, hanem Service és BroadcastReceiver számára is deklarálható. Service esetén ez lehetővé teszi a háttérszolgáltatás elindítását más alkalmazásokból, BroadcastReceiver esetén pedig rendszerüzenetek fogadását.
A MIME-típus a data címkében a mimeType attribútomokon keresztül kerül meghatározásra. A szűrő meghatározza, hogy a komponens milyen adattípusokat képes kezelni — például image/* az összes képhez vagy text/plain csak egyszerű szöveghez. A MIME-típusok kombinálhatók URI-sémákkal.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is