Intent Filter — AndroidManifest.xml faylında deklarativ bəyannamədir və sistemə proqram komponentinin hansı qeyri-açıq niyyətləri emal edə biləcəyini göstərir. Android Developer Guide-a görə, filtr action, category və data ehtiva edir və onların əsasında sistem digər tətbiqlərdən və sistem hadisələrindən gələn çağırışları yönləndirir. Android proqramlaşdırması Intent Filter-dən müxtəlif tətbiqlərin komponentləri arasında zəif əlaqənin əsas mexanizmi kimi istifadə edir.
Əsas məqamlar
Intent Filter — Android tətbiqinin konfiqurasiya elementidir və sistemə komponentin müəyyən qeyri-açıq niyyət növlərini emal edə biləcəyi barədə məlumat verir. Konkret sinfi göstərən açıq Intent-dən fərqli olaraq, qeyri-açıq Intent yalnız tələb olunan hərəkətin təsvirini ehtiva edir və sistem qeydiyyatdan keçmiş filtrlər əsasında uyğun komponenti özü tapır.
Filtrlər komponentin daxilində — Activity, Service və ya BroadcastReceiver — AndroidManifest.xml faylında bəyan edilir. Hər bir filtr bir neçə action, category və data elementi ehtiva edə bilər. Komponentin qeyri-məhdud sayında Intent Filter-i ola bilər və hər biri ayrıca emal ssenarisini təsvir edir.
Intent Filter tətbiq komponentləri arasında zəif əlaqə prinsipini həyata keçirir. A tətbiqi B tətbiqinin varlığından xəbərdar olmaq məcburiyyətində deyil — o, sadəcə hərəkətin təsviri ilə Intent göndərir və sistem onu filtrlər əsasında yönləndirir. Bu mexanizm Share Sheet, brauzer seçimi və deep link emalının əsasındadır.
Açıq Intent işə salınacaq komponentin konkret sinfini göstərir. Onlar bir tətbiq daxilində daxili naviqasiya üçün istifadə olunur, proqramçı hansı Activity-nin açılacağını dəqiq biləndə. Qeyri-açıq Intent yalnız hərəkətin təsvirini ehtiva edir və komponent sistem tərəfindən dinamik olaraq müəyyənləşdirilir.
Intent Filter yalnız qeyri-açıq Intent ilə işləyir. Intent-də konkret sinif göstərilərsə, sistem bütün filtrləri nəzərdən qaçırır və göstərilən komponenti birbaşa işə salır. Filtrlər yalnız qeyri-açıq çağırışları həll edərkən yoxlanılır ki, bu da onları tətbiqlərarası qarşılıqlı əlaqənin əsas elementi edir.
| Xüsusiyyət | Açıq Intent | Qeyri-açıq Intent |
|---|---|---|
| Komponent | Açıq şəkildə göstərilir (className) | Sistem tərəfindən müəyyənləşdirilir |
| Intent Filter | Tələb olunmur | Məcburidir |
| Nümunə | startActivity(Intent(this, ProfileActivity::class.java)) | Intent(ACTION_VIEW, Uri.parse("https://example.com")) |
| Təhlükəsizlik | Daha yüksək (kəsmə yoxdur) | Daha aşağı (münaqişələr mümkündür) |
Hər bir Intent Filter üç qrup elementdən ibarətdir — action, category və data — onların kombinasiyası komponentin hansı Intent-ləri qəbul edəcəyini müəyyənləşdirir. Filtr Intent hər qrupun ən azı bir elementinə uyğun gəldikdə keçmiş sayılır.
Action yerinə yetirilən hərəkəti təsvir edir — baxmaq, redaktə etmək, göndərmək. Category emal üçün əlavə kontekst əlavə edir — məsələn, brauzerdən işə salma imkanı. Data URI və ya MIME növü vasitəsilə emal olunan məlumatın formatını müəyyənləşdirir.
İstifadəçi profillərinə keçidləri açan Activity üçün Intent Filter nümunəsi. Filtr dəqiq yönləndirmə üçün hər üç qrup elementi ehtiva edir.
<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>
category DEFAULT-in məcburi göstərilməsinə diqqət yetirin — onsuz sistem komponentə qeyri-açıq Intent ötürməyəcək. BROWSABLE kateqoriyası keçid brauzerdən emal edilməli olduqda əlavə edilir.
Android-də deep link sxem, host və yolu ehtiva edən data teqi ilə VIEW action-lı Intent Filter vasitəsilə konfiqurasiya edilir. myapp://profile/42 şəklindəki keşidə kliklədikdə sistem uyğun filtri olan Activity-ni tapır və onu ötürülən URI ilə işə salır. Dəqiq uyğlaşdırma üçün pathPrefix, pathPattern və ya path-i düzgün konfiqurasiya etmək vacibdir.
Android 6-dan (API 23) başlayaraq HTTPS vasitəsilə təsdiqlənmiş deep link olan App Links dəstəyi əlavə edildi. App Links üçün eyni Intent Filter istifadə olunur, lakin Digital Asset Links vasitəsilə əlavə domen təsdiqi ilə. Təsdiqləmədən sonra sistem seçim dialoqu olmadan avtomatik olaraq tətbiqi açır.
HTTPS keçidi ilə təsdiqləmə ilə App Link üçün filtr nümunəsi. Bu halda sxem həmişə https-dir və host Digital Asset Links-də göstərilən domenə uyğun gəlir.
<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>
autoVerify atributu sistemə tətbiqin quraşdırılması zamanı Digital Asset Links-i yoxlamağı tapşırır. Təsdiqləmə uğurlu olarsa, tətbiq avtomatik olaraq göstərilən domen və yollar üçün defolt emalçıya çevrilir.
Sistem Intent-i emal etmək üçün komponent seçdikdən sonra, proqramçı hədəf komponent daxilində daxil olan niyyətdən məlumatları çıxarmalıdır. Activity üçün onCreate() metodunda getIntent() istifadə olunur, BroadcastReceiver üçün isə Intent parametr kimi ötürülən onReceive() metodu istifadə olunur.
Məlumatların çıxarılması əməliyyat növünü müəyyənləşdirmək üçün action, URI üçün data və əlavə məlumat üçün extra-parametrlərin alınmasını əhatə edir. Bu elementlərin hər biri olmaya bilər, buna görə istifadədən əvvəl null yoxlaması məcburidir.
Kotlin-də Activity-də daxil olan deep link-in emalı nümunƏsi. Kod Intent-dən URI-ni çıxarır və host və yol əsasında naviqasiya qərarı verir.
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)
}
}
}
Intent və data-nın null olduğunu yoxlamaq üçün safe call operator-dən istifadə etmək tövsiyə olunur, çünki aktivlik daxil olan deep link olmadan işə salına bilər. Naviqasiyada istifadədən əvvəl host və pathSegment-i null üçün yoxlamaq da vacibdir.
Bir neçə tətbiq eyni qeyri-açıq Intent-ə uyğun Intent Filter qeydiyyatdan keçiribsə, sistem istifadəçiyə seçim dialoqu göstərir. İstifadəçi birdəfəlik istifadə üçün tətbiq seçə və ya defolt emalçı təyin edə bilər. Android 10-dan başlayaraq seçim dialoqu yalnız ilk çağırışda göstərilir, sonra sistem istifadəçinin seçimini yadda saxlayır.
Prioriteti idarə etmək üçün intent-filter teqində android:priority atributu istifadə olunur. Dəyər nə qədər yüksək olarsa, komponentin münaqişələrin həllində prioriteti bir o qədər böyük olar. Lakin prioritet müxtəlif tətbiqlərin filtrləri üçün işləmir — bu halda heç bir tətbiq defolt olaraq təyin edilməyibsə, həmişə seçim dialoqu göstərilir.
Proqramçı Intent.createChooser() vasitəsilə proqramlı şəkildə seçim dialoqunu çağıra bilər, hədəf Intent və başlığı ötürərək. Bu, tətbiq defolt olaraq təyin edilsə belə, istifadəçiyə açıq şəkildə emalçı seçməyi təklif etmək istədikdə faydalıdır. Məsələn, şəkilləri sosial şəbəkələrə ACTION_SEND ilə göndərərkən createChooser defolt parametrlərdən asılı olmayaraq dialoqun göstərilməsini təmin edir.
Ən geniş yayılmış səhvlərdən biri Intent Filter-də DEFAULT kateqoriyasının olmamasıdır. Proqramçılar konfiqurasiyanı nümunələrdən köçürürlər, lakin bu kateqoriyanı əlavə etməyi unudurlar, nəticədə Activity qeyri-açıq Intent qəbul etmir. Sistem sadəcə qeyri-açıq çağırışlar üçün filtri görmür, baxmayaraq ki, açıq Intent işləməyə davam edir.
İkinci geniş yayılmış səhv data teqində tam URI olmadan scheme-in düzgün göstərilməməsidir. Yalnız sxem göstərilər, lakin host göstərilməzsə, filtr bu sxemli bütün keçidləri istənilən mənbədən qəbul edəcək ki, bu da yoxlanılmamış mənbələrdən arzuolunmaz çağırışlara səbəb ola bilər. Həmişə ən azından scheme və host göstərmək tövsiyə olunur.
Üçüncü səhv Activity kodunda intent.data-nın null yoxlamasının olmamasıdır. Activity deep link vasitƏsilə deyil, standart şəkildə launcher-dən işə salınarsa, Intent URI ehtiva etmir. Yoxlanılmadan intent.data-ya müraciət NullPointerException-a və tətbiqin çökməsinə səbəb olur. Həmişə safe call operatoru ilə intent?.data?.toString() istifadə edin.
Tez-tez verilən suallar
Bəli, qeyri-açıq Intent qəbul etmək üçün DEFAULT kateqoriyası məcburidir. Onsuz sistem komponentə qeyri-açıq çağırışları ötürməyəcək və Intent Filter yalnız filtrləri yoxlamayan açıq Intent üçün işləyəcək.
Heç bir məhdudiyyət yoxdur. Bir Activity istənilən sayda Intent Filter ehtiva edə bilər. Hər filtr ayrıca emal ssenarisini təsvir edir, məsələn biri deep link üçün, digəri faylları emal etmək üçün, üçüncüsü Share Sheet üçün.
Intent Filter qeyri-açıq Intent-i emal etmək üçün ümumi mexanizmdir. App Link Digital Asset Links vasitəsilə təsdiqlənmə ilə Intent Filter-in xüsusi halıdır və göstərilən domendə HTTPS keçidləri üçün tətbiqi avtomatik olaraq defolt emalçı təyin edir.
Bəli, Intent Filter təkcə Activity üçün deyil, həm də Service və BroadcastReceiver üçün bəyan edilə bilər. Service üçün bu, fon xidmətini digər tətbiqlərdən işə salmağa imkan verir, BroadcastReceiver üçün isə sistem genişyayım mesajlarını qəbul etməyə imkan verir.
MIME növü data teqində mimeType atributları vasitəsilə göstərilir. Filtr komponentin hansı məlumat növlərini emal edə biləcəyini müəyyənləşdirir — məsələn, bütün şəkillər üçün image/* və ya yalnız düz mətn üçün text/plain. MIME növləri URI sxemləri ilə birləşdirilə bilər.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun