Intent Filter to deklaratywne ogłoszenie w AndroidManifest.xml, które wskazuje systemowi, jakie niejawne zamiary może obsługiwać komponent aplikacji. Według Android Developer Guide, filtr zawiera action, category i data, na podstawie których system kieruje wywołania z innych aplikacji i zdarzeń systemowych. Programowanie na Androida używa Intent Filter jako głównego mechanizmu luźnego powiązania między komponentami różnych aplikacji.
Najważniejsze
Intent Filter to element konfiguracji aplikacji Android, który informuje system o możliwości komponentu do obsługi określonych typów niejawnych zamiarów. W przeciwieństwie do jawnych Intent, które wskazują konkretną klasę, niejawne Intent zawierają tylko opis wymaganego działania, a system sam znajduje odpowiedni komponent na podstawie zarejestrowanych filtrów.
Filtry są deklarowane wewnątrz komponentu — Activity, Service lub BroadcastReceiver — w pliku AndroidManifest.xml. Każdy filtr może zawierać wiele elementów action, category i data. Komponent może mieć nieograniczoną liczbę Intent Filter, z których każdy opisuje oddzielny scenariusz obsługi.
Intent Filter realizuje zasadę luźnego powiązania między komponentami aplikacji. Aplikacja A nie musi wiedzieć o istnieniu aplikacji B — wysyła po prostu Intent z opisem działania, a system kieruje go na podstawie filtrów. Ten mechanizm leży u podstaw Share Sheet, wyboru przeglądarki i obsługi deep link.
Jawne Intent wskazują konkretną klasę komponentu do uruchomienia. Są używane do wewnętrznej nawigacji w obrębie jednej aplikacji, gdy programista dokładnie wie, które Activity ma się otworzyć. Niejawne Intent zawierają tylko opis działania, a komponent jest określany przez system dynamicznie.
Intent Filter działa wyłącznie z niejawnymi Intent. Jeśli w Intent określono konkretną klasę, system ignoruje wszystkie filtry i uruchamia wskazany komponent bezpośrednio. Filtry są sprawdzane tylko przy rozwiązywaniu niejawnych wywołań, co czyni je kluczowym elementem międzyaplikacyjnej interakcji.
| Cecha | Jawny Intent | Niejawny Intent |
|---|---|---|
| Komponent | Określony jawnie (className) | Określany przez system |
| Intent Filter | Nie wymagany | Wymagany |
| Przykład | startActivity(Intent(this, ProfileActivity::class.java)) | Intent(ACTION_VIEW, Uri.parse("https://example.com")) |
| Bezpieczeństwo | Większe (brak przechwytywania) | Mniejsze (możliwe konflikty) |
Każdy Intent Filter składa się z trzech grup elementów — action, category i data — których kombinacja określa, jakie Intent będzie otrzymywać komponent. Filtr jest uznawany za spełniony, jeśli Intent odpowiada co najmniej jednemu elementowi każdej grupy.
Action opisuje wykonywane działanie — przeglądanie, edycję, wysyłanie. Category dodaje dodatkowy kontekst obsługi — na przykład możliwość uruchomienia z przeglądarki. Data określa format przetwarzanych informacji poprzez URI lub typ MIME.
Przykład Intent Filter dla Activity otwierającej linki do profili użytkowników. Filtr zawiera wszystkie trzy grupy elementów dla precyzyjnego kierowania.
<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>
Zwróć uwagę na obowiązkowe określenie category DEFAULT — bez niego system nie będzie przekazywać komponentowi niejawnych Intent. Kategoria BROWSABLE jest dodawana, jeśli link ma być obsługiwany z przeglądarki.
Deep link na Androidzie konfiguruje się przez Intent Filter z action VIEW i tagiem data zawierającym schemat, host i ścieżkę. Po kliknięciu linku w postaci myapp://profile/42 system znajduje Activity z odpowiednim filtrem i uruchamia ją z przekazanym URI. Ważne jest prawidłowe skonfigurowanie pathPrefix, pathPattern lub path dla dokładnego dopasowania.
Począwszy od Android 6 (API 23) pojawiła się obsługa App Links — zweryfikowanych deep link przez HTTPS. Dla App Links używa się tego samego Intent Filter, ale z dodatkową weryfikacją domeny przez Digital Asset Links. Po weryfikacji system automatycznie otwiera aplikację bez okna wyboru.
Przykład filtra dla App Link z weryfikacją przez link HTTPS. W tym przypadku schemat to zawsze https, a host odpowiada domenie określonej w 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>
Atrybut autoVerify nakazuje systemowi sprawdzenie Digital Asset Links podczas instalacji aplikacji. Jeśli weryfikacja powiedzie się, aplikacja automatycznie staje się domyślnym obsługującym dla określonej domeny i ścieżek.
Po tym, jak system wybrał komponent do obsługi Intent, programista musi wyodrębnić dane z przychodzącego zamiaru wewnątrz docelowego komponentu. Dla Activity używa się metody getIntent() w onCreate(), dla BroadcastReceiver — metody onReceive(), gdzie Intent jest przekazywany jako parametr.
Wyodrębnianie danych obejmuje pobranie action do określenia typu operacji, data dla URI i extra-parametrów dla dodatkowych informacji. Każdy z tych elementów może być nieobecny, dlatego wymagane jest sprawdzenie na null przed użyciem.
Przykład obsługi przychodzącego deep link w Activity w Kotlinie. Kod wyodrębnia URI z Intent i na podstawie hosta i ścieżki podejmuje decyzję o nawigacji.
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)
}
}
}
Zaleca się używanie safe call operator do sprawdzenia intent i data na null, ponieważ aktywność może być uruchomiona bez przychodzącego deep link. Należy również sprawdzić host i pathSegment na null przed ich użyciem w nawigacji.
Jeśli kilka aplikacji zarejestrowało Intent Filter pasujący do tego samego niejawnego Intent, system pokazuje użytkownikowi okno wyboru. Użytkownik może wybrać aplikację do jednorazowego użycia lub ustawić domyślnego obsługującego. Od Androida 10 okno wyboru pojawia się tylko przy pierwszym wywołaniu, po czym system zapamiętuje wybór użytkownika.
Do zarządzania priorytetem używa się atrybutu android:priority w tagu intent-filter. Im wyższa wartość, tym większy priorytet ma komponent przy rozwiązywaniu konfliktów. Jednak priorytet nie działa dla filtrów z różnych aplikacji — w tym przypadku zawsze pokazywane jest okno wyboru, jeśli żadna aplikacja nie jest ustawiona jako domyślna.
Programista może programowo wywołać okno wyboru przez Intent.createChooser(), przekazując docelowy Intent i tytuł. Jest to przydatne, gdy aplikacja chce wyraźnie zaproponować użytkownikowi wybór obsługującego, nawet jeśli ustawiona jest aplikacja domyślna. Na przykład przy wysyłaniu obrazów do sieci społecznościowych przez ACTION_SEND z createChooser gwarantuje pokazanie okna wyboru niezależnie od ustawień domyślnych.
Jednym z najczęstszych błędów jest brak kategorii DEFAULT w Intent Filter. Programiści kopiują konfigurację z przykładów, ale zapominają dodać tej kategorii, w wyniku czego Activity nie otrzymuje niejawnych Intent. System po prostu nie widzi filtra dla niejawnych wywołań, chociaż jawne Intent nadal działają.
Drugim częstym błędem jest nieprawidłowe określenie scheme w tagu data bez pełnego URI. Jeśli określono tylko schemat, ale nie określono hosta, filtr będzie przyjmować wszystkie linki z tym schematem z dowolnego źródła, co może prowadzić do niepożądanych wywołań z niezweryfikowanych źródeł. Zaleca się zawsze określanie co najmniej scheme i host.
Trzecim błędem jest brak sprawdzenia intent.data na null w kodzie Activity. Jeśli Activity jest uruchamiane nie przez deep link, ale standardowo z laucher, Intent nie zawiera URI. Odwołanie do intent.data bez sprawdzenia powoduje NullPointerException i awarię aplikacji. Zawsze używaj intent?.data?.toString() z operatorem safe call.
Często zadawane pytania
Tak, do otrzymywania niejawnych Intent kategoria DEFAULT jest obowiązkowa. Bez niej system nie będzie przekazywać komponentowi niejawnych wywołań, a Intent Filter będzie działać tylko dla jawnych Intent, które i tak nie sprawdzają filtrów.
Nie ma ograniczeń. Jedna Activity może zawierać dowolną liczbę Intent Filter. Każdy filtr opisuje oddzielny scenariusz obsługi, na przykład jeden filtr dla deep link, drugi do obsługi plików, trzeci dla Share Sheet.
Intent Filter to ogólny mechanizm do obsługi niejawnych Intent. App Link to szczególny przypadek Intent Filter z weryfikacją przez Digital Asset Links, który automatycznie ustawia aplikację jako domyślnego obsługującego dla linków HTTPS na określonej domenie.
Tak, Intent Filter można deklarować nie tylko dla Activity, ale także dla Service i BroadcastReceiver. Dla Service pozwala to uruchamiać usługę tła z innych aplikacji, dla BroadcastReceiver — odbierać systemowe komunikaty rozgłaszane.
Typ MIME jest określany w tagu data przez atrybuty mimeType. Filtr określa, jakie typy danych komponent może obsługiwać — na przykład image/* dla wszystkich obrazów lub text/plain tylko dla zwykłego tekstu. Typy MIME mogą być łączone ze schematami URI.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również