Intent Filter este o declarație declarativă în AndroidManifest.xml care indică sistemului ce intenții implicite poate procesa o componentă de aplicație. Conform Android Developer Guide, filtrul conține action, category și data, pe baza cărora sistemul rutează apelurile de la alte aplicații și evenimente de sistem. Dezvoltarea Android utilizează Intent Filter ca mecanism principal de cuplare slabă între componentele diferitelor aplicații.
Principalele puncte
Intent Filter este un element de configurare al aplicației Android care informează sistemul despre capacitatea componentei de a procesa anumite tipuri de intenții implicite. Spre deosebire de Intent explicite care indică o clasă specifică, Intent implicite conțin doar descrierea acțiunii solicitate, iar sistemul găsește singur componenta potrivită pe baza filtrelor înregistrate.
Filtrele sunt declarate în interiorul componentei — Activity, Service sau BroadcastReceiver — în fișierul AndroidManifest.xml. Fiecare filtru poate conține mai multe elemente action, category și data. O componentă poate avea un număr nelimitat de Intent Filter, fiecare descriind un scenariu separat de procesare.
Intent Filter implementează principiul cuplării slabe între componentele aplicațiilor. Aplicația A nu trebuie să știe de existența aplicației B — trimite pur și simplu un Intent cu descrierea acțiunii, iar sistemul îl rutează pe baza filtrelor. Acest mecanism stă la baza Share Sheet, selectării browserului și procesării deep link.
Intent explicite indică clasa specifică a componentei de lansat. Sunt utilizate pentru navigarea internă în cadrul aceleiași aplicații, când dezvoltatorul știe exact ce Activity trebuie deschisă. Intent implicite conțin doar descrierea acțiunii, iar componenta este determinată dinamic de sistem.
Intent Filter funcționează exclusiv cu Intent implicite. Dacă în Intent este specificată o clasă concretă, sistemul ignoră toate filtrele și lansează direct componenta indicată. Filtrele sunt verificate doar la rezolvarea apelurilor implicite, ceea ce le face un element cheie al interacțiunii dintre aplicații.
| Caracteristică | Intent explicit | Intent implicit |
|---|---|---|
| Componenta | Specificată explicit (className) | Determinată de sistem |
| Intent Filter | Nu este necesar | Obligatoriu |
| Exemplu | startActivity(Intent(this, ProfileActivity::class.java)) | Intent(ACTION_VIEW, Uri.parse("https://example.com")) |
| Securitate | Mai mare (fără interceptare) | Mai mică (posibile conflicte) |
Fiecare Intent Filter constă în trei grupuri de elemente — action, category și data — a căror combinație determină ce Intent va primi componenta. Filtrul este considerat îndeplinit dacă Intentul corespunde cel puțin unui element din fiecare grup.
Action descrie acțiunea executată — vizualizare, editare, trimitere. Category adaugă un context suplimentar de procesare — de exemplu, posibilitatea de lansare din browser. Data definește formatul informațiilor procesate prin URI sau tip MIME.
Exemplu de Intent Filter pentru o Activity care deschide linkuri către profiluri de utilizatori. Filtrul include toate cele trei grupuri de elemente pentru rutare precisă.
<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>
Observați specificarea obligatorie a category DEFAULT — fără ea, sistemul nu va transmite componentei Intent implicite. Categoria BROWSABLE se adaugă dacă linkul trebuie procesat din browser.
Deep link pe Android se configurează prin Intent Filter cu action VIEW și tagul data care conține schema, hostul și calea. La accesarea unui link de forma myapp://profile/42, sistemul găsește Activity cu filtrul potrivit și o lansează cu URI-ul transmis. Este important să configurați corect pathPrefix, pathPattern sau path pentru potrivire precisă.
începând cu Android 6 (API 23) a apărut suportul pentru App Links — deep link-uri verificate prin HTTPS. Pentru App Links se utilizează același Intent Filter, dar cu verificare suplimentară a domeniului prin Digital Asset Links. După verificare, sistemul deschide automat aplicația fără dialog de selecție.
Exemplu de filtru pentru App Link cu verificare prin link HTTPS. În acest caz, schema este întotdeauna https, iar hostul corespunde domeniului specificat în 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>
Atributul autoVerify instruiește sistemul să verifice Digital Asset Links la instalarea aplicației. Dacă verificarea reușește, aplicația devine automat gestionarul implicit pentru domeniul și căile specificate.
După ce sistemul a selectat componenta pentru procesarea Intentului, dezvoltatorul trebuie să extragă datele din intenția primită în interiorul componentei șintă. Pentru Activity se utilizează metoda getIntent() în onCreate(), pentru BroadcastReceiver — metoda onReceive(), unde Intentul este transmis ca parametru.
Extragerea datelor include obținerea action pentru determinarea tipului de operație, data pentru URI și parametrii extra pentru informații suplimentare. Fiecare dintre aceste elemente poate lipsi, deci este obligatorie verificarea null înainte de utilizare.
Exemplu de procesare a unui deep link primit într-o Activity în Kotlin. Codul extrage URI-ul din Intent și pe baza hostului și a căii ia o decizie de navigare.
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)
}
}
}
Se recomandă utilizarea safe call operator pentru verificarea intent și data la null, deoarece activitatea poate fi lansată fără un deep link primit. De asemenea, trebuie verificate host și pathSegment pentru null înainte de utilizare în navigare.
Dacă mai multe aplicații au înregistrat un Intent Filter potrivit pentru același Intent implicit, sistemul afișează utilizatorului un dialog de selecție. Utilizatorul poate alege aplicația pentru utilizare o singură dată sau poate seta un gestionar implicit. începând cu Android 10, dialogul de selecție se afișează doar la prima apelare, după care sistemul reține alegerea utilizatorului.
Pentru gestionarea priorității se utilizează atributul android:priority în tagul intent-filter. Cu cât valoarea este mai mare, cu atât prioritatea componentei la rezolvarea conflictelor este mai mare. Totuși, prioritatea nu funcționează pentru filtre din aplicații diferite — în acest caz se afișează întotdeauna dialogul de selecție, dacă nicio aplicație nu este setată ca implicită.
Dezvoltatorul poate apela programatic dialogul de selecție prin Intent.createChooser(), transmițând Intentul și un titlu. Acest lucru este util când aplicația dorește să propună explicit utilizatorului să aleagă un gestionar, chiar dacă este setată o aplicație implicită. De exemplu, la trimiterea de imagini în rețele sociale prin ACTION_SEND cu createChooser se garantează afișarea dialogului indiferent de setările implicite.
Una dintre cele mai frecvente erori și anume lipsa categoriei DEFAULT în Intent Filter. Dezvoltatorii copie configurația din exemple, dar uită să adauge această categorie, rezultând că Activity nu primește Intent implicite. Sistemul pur și simplu nu vede filtrul pentru apelurile implicite, deși Intent explicite continuă să funcționeze.
A doua eroare frecventă este specificarea incorectă a scheme în tagul data fără un URI complet. Dacă este specificată doar schema, dar nu și hostul, filtrul va accepta toate linkurile cu această schemă din orice sursă, ceea ce poate duce la apeluri nedorite din surse neverificate. Se recomandă să specificați întotdeauna cel puțin scheme și host.
A treia eroare este lipsa verificării intent.data la null în codul Activity. Dacă Activity este lansată nu printr-un deep link, ci în mod standard din launcher, Intent nu conține URI. Accesarea intent.data fără verificare provoacă NullPointerException și prăbușirea aplicației. Utilizați întotdeauna intent?.data?.toString() cu operatorul safe call.
întrebări frecvente
Da, pentru primirea Intent implicite categoria DEFAULT este obligatorie. Fără ea, sistemul nu va transmite componentei apelurile implicite, iar Intent Filter va funcționa doar pentru Intent explicite care oricum nu verifică filtrele.
Nu există limitări. O Activity poate conține orice număr de Intent Filter. Fiecare filtru descrie un scenariu separat de procesare, de exemplu un filtru pentru deep link, altul pentru procesarea fișierelor, altul pentru Share Sheet.
Intent Filter este un mecanism general pentru procesarea Intent implicite. App Link este un caz particular al Intent Filter cu verificare prin Digital Asset Links, care desemnează automat aplicația ca gestionar implicit pentru linkurile HTTPS pe un domeniu specificat.
Da, Intent Filter poate fi declarat nu doar pentru Activity, ci și pentru Service și BroadcastReceiver. Pentru Service, acest lucru permite lansarea serviciului de fundal din alte aplicații, iar pentru BroadcastReceiver — primirea mesajelor de sistem difuzate.
Tipul MIME este specificat în tagul data prin atributele mimeType. Filtrul determină ce tipuri de date poate procesa componenta — de exemplu, image/* pentru toate imaginile sau text/plain doar pentru text simplu. Tipurile MIME pot fi combinate cu scheme URI.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și