Intent Filter: co to jest, jak działa i jak go używać w programowaniu

Autor: IT Sectr Opublikowano: 2026-05-14 Czas czytania: 8 min

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 — deklaracja XML w manifeście określająca typy niejawnych Intent, które może obsługiwać Activity, Service lub BroadcastReceiver.
  • Action określa działanie, które ma wykonać komponent — na przykład ACTION_VIEW do przeglądania danych lub ACTION_SEND do wysyłania treści.
  • Category określa dodatkową kategorię komponentu — BROWSABLE zezwala na wywołanie z przeglądarki, DEFAULT jest wymagana dla niejawnych Intent.
  • Data opisuje URI, typ MIME lub schemat przetwarzanych danych, co jest kluczowe dla konfiguracji deep link w aplikacji.
  • Konflikty przy wielu aplikacjach obsługujących ten sam Intent są rozwiązywane przez systemowe okno wyboru lub ustawienia domyślne.

Co to jest Intent Filter?

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.

Rola w architekturze Androida

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.

Typy Intent: jawne i niejawne

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.

Porównanie jawnych i niejawnych Intent

CechaJawny IntentNiejawny Intent
KomponentOkreślony jawnie (className)Określany przez system
Intent FilterNie wymaganyWymagany
PrzykładstartActivity(Intent(this, ProfileActivity::class.java))Intent(ACTION_VIEW, Uri.parse("https://example.com"))
BezpieczeństwoWiększe (brak przechwytywania)Mniejsze (możliwe konflikty)

Struktura Intent Filter w manifeście

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.

Elementy taga intent-filter

Przykład Intent Filter dla Activity otwierającej linki do profili użytkowników. Filtr zawiera wszystkie trzy grupy elementów dla precyzyjnego kierowania.

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>

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.

Tag data dla URL

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.

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>

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.

Obsługa Intent w komponentach aplikacji

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.

Kod obsługi w Activity

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.

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)
        }
    }
}

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.

Priorytet i rozwiązywanie konfliktów

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.

Okno wyboru aplikacji

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.

Typowe błędy przy konfiguracji Intent Filter

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

Czy obowiązkowe jest określenie category DEFAULT w Intent Filter?

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.

Ile Intent Filter może mieć jedna Activity?

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.

Czym różni się Intent Filter od App Link?

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.

Czy można użyć Intent Filter dla Service lub BroadcastReceiver?

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.

Jak Intent Filter obsługuje typy MIME?

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

  • Intent Filter — deklaracja XML w AndroidManifest.xml określająca, jakie niejawne Intent może obsługiwać komponent aplikacji.
  • Trzy grupy — action (działanie), category (kategoria), data (URI i MIME) tworzą filtr; komponent otrzymuje Intent, jeśli pasują wszystkie określone grupy.
  • Deep link konfiguruje się przez action VIEW i tag data ze schematem, hostem i ścieżką, opcjonalnie z autoVerify dla App Links.
  • App Links — zweryfikowane linki HTTPS przez Digital Asset Links, niewymagające okna wyboru aplikacji.
  • Konflikty przy dopasowaniu wielu filtrów są rozwiązywane przez systemowe okno wyboru lub priorytet dla komponentów jednej aplikacji.
  • Obsługa przychodzącego Intent odbywa się przez intent.data w Activity lub onReceive w BroadcastReceiver z obowiązkowym sprawdzeniem na null.
  • Zastosowanie — Intent Filter jest używany do międzyaplikacyjnej interakcji, obsługi linków, plików i zdarzeń systemowych.

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.

Omów projekt

Przeczytaj również