Ang Intent Filter ay isang deklaratibong pahayag sa AndroidManifest.xml na nagsasabi sa system kung aling mga implicit na intensyon ang kayang iproseso ng isang component ng application. Ayon sa Android Developer Guide, ang filter ay naglalaman ng action, category at data, kung saan ibinabase ng system ang pagruta ng mga tawag mula sa ibang mga application at mga system event. Pag-develop ng Android ay gumagamit ng Intent Filter bilang pangunahing mekanismo ng mahinang pagkakabit sa pagitan ng mga component ng iba't ibang application.
Mga Pangunahing Punto
Intent Filter ay isang elemento ng configuration ng Android application na nagpapaalam sa system tungkol sa kakayahan ng component na magproseso ng mga tiyak na uri ng implicit na intensyon. Hindi tulad ng tahasang Intent na tumuturo sa isang partikular na klase, ang implicit na Intent ay naglalaman lamang ng paglalarawan ng hinihinging aksyon, at ang system mismo ang nakakahanap ng angkop na component batay sa mga rehistradong filter.
Ang mga filter ay idineklara sa loob ng component — Activity, Service o BroadcastReceiver — sa file na AndroidManifest.xml. Ang bawat filter ay maaaring maglaman ng maraming elemento ng action, category at data. Ang isang component ay maaaring magkaroon ng walang limitasyong bilang ng Intent Filter, bawat isa ay naglalarawan ng hiwalay na senaryo ng pagproseso.
Ang Intent Filter ay nagpapatupad ng prinsipyo ng mahinang pagkakabit sa pagitan ng mga component ng application. Ang application A ay hindi kailangang malaman ang tungkol sa pagkakaroon ng application B — ito ay nagpapadala lamang ng Intent na may paglalarawan ng aksyon, at iruruta ito ng system batay sa mga filter. Ang mekanismong ito ay nasa ilalim ng Share Sheet, pagpili ng browser at pagproseso ng deep link.
Ang tahasang Intent ay tumuturo sa tiyak na klase ng component na ilulunsad. Ginagamit ang mga ito para sa panloob na nabigasyon sa loob ng isang application, kapag alam ng developer kung aling Activity ang dapat buksan. Ang implicit na Intent ay naglalaman lamang ng paglalarawan ng aksyon, at ang component ay tinutukoy ng system nang pabago-bago.
Intent Filter ay gumagana lamang sa mga implicit na Intent. Kung ang isang partikular na klase ay tinukoy sa Intent, hindi papansinin ng system ang lahat ng filter at direktang ilulunsad ang tinukoy na component. Ang mga filter ay sinusuri lamang kapag nireresolba ang mga implicit na tawag, na ginagawang pangunahing elemento ng interaksyon sa pagitan ng mga application.
| Katangian | Tahasan na Intent | Implicit na Intent |
|---|---|---|
| Component | Tahasang tinukoy (className) | Tinutukoy ng system |
| Intent Filter | Hindi kinakailangan | Sapilitan |
| Halimbawa | startActivity(Intent(this, ProfileActivity::class.java)) | Intent(ACTION_VIEW, Uri.parse("https://example.com")) |
| Seguridad | Mas mataas (walang panghihimasok) | Mas mababa (posibleng salungatan) |
Ang bawat Intent Filter ay binubuo ng tatlong grupo ng mga elemento — action, category at data — na ang kombinasyon ay tumutukoy kung aling Intent ang matatanggap ng component. Ang filter ay itinuturing na pumasa kung ang Intent ay tumutugma sa kahit isang elemento mula sa bawat grupo.
Ang Action ay naglalarawan ng ginawang aksyon — pagtingin, pag-edit, pagpapadala. Ang Category ay nagdaragdag ng karagdagang konteksto ng pagproseso — halimbawa, kakayahang ilunsad mula sa browser. Ang Data ay tumutukoy sa format ng pinoprosesong impormasyon sa pamamagitan ng URI o MIME type.
Halimbawa ng Intent Filter para sa Activity na nagbubukas ng mga link sa profile ng user. Ang filter ay may kasamang lahat ng tatlong grupo ng elemento para sa tumpak na pagruta.
<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>
Tandaan ang sapilitang pagbanggit ng category DEFAULT — kung wala ito, hindi magpapadala ang system ng implicit na Intent sa component. Ang kategoryang BROWSABLE ay idinaragdag kung ang link ay dapat iproseso mula sa browser.
Ang deep link sa Android ay isinaayos sa pamamagitan ng Intent Filter na may action VIEW at tag na data na naglalaman ng schema, host at path. Kapag nag-click sa isang link na may anyong myapp://profile/42, hahanapin ng system ang Activity na may angkop na filter at ilulunsad ito gamit ang ipinadalang URI. Mahalagang i-configure nang tama ang pathPrefix, pathPattern o path para sa tumpak na pagtutugma.
Simula sa Android 6 (API 23) ay may suporta para sa App Links — na-verify na deep link sa pamamagitan ng HTTPS. Para sa App Links ay ginagamit ang parehong Intent Filter, ngunit may karagdagang pag-verify ng domain sa pamamagitan ng Digital Asset Links. Pagkatapos ng pag-verify, awtomatikong bubuksan ng system ang application nang walang dialog ng pagpili.
Halimbawa ng filter para sa App Link na may pag-verify sa pamamagitan ng HTTPS link. Sa kasong ito ang schema ay palaging https, at ang host ay tumutugma sa domain na tinukoy sa 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>
Ang attribute na autoVerify ay nag-uutos sa system na suriin ang Digital Asset Links sa pag-install ng application. Kung magtagumpay ang pag-verify, ang application ay awtomatikong magiging default na tagapangasiwa para sa tinukoy na domain at mga path.
Matapos pumili ng system ng component para iproseso ang Intent, dapat kunin ng developer ang data mula sa papasok na intensyon sa loob ng target na component. Para sa Activity ay ginagamit ang paraang getIntent() sa onCreate(), para sa BroadcastReceiver — ang paraang onReceive(), kung saan ang Intent ay ipinapadala bilang parameter.
Ang pagkuha ng data ay may kasamang pagkuha ng action para sa pagtukoy ng uri ng operasyon, data para sa URI at mga extra-parameter para sa karagdagang impormasyon. Ang bawat isa sa mga elementong ito ay maaaring wala, kaya ang pagsusuri ng null bago gamitin ay sapilitan.
Halimbawa ng pagproseso ng papasok na deep link sa isang Activity sa Kotlin. Kinukuha ng code ang URI mula sa Intent at batay sa host at path ay gumagawa ng desisyon sa nabigasyon.
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)
}
}
}
Inirerekomenda ang paggamit ng safe call operator para sa pagsusuri ng intent at data sa null, dahil ang aktibidad ay maaaring ilunsad nang walang papasok na deep link. Kailangan ding suriin ang host at pathSegment para sa null bago gamitin sa nabigasyon.
Kung maraming application ang nagrehistro ng Intent Filter na angkop para sa parehong implicit na Intent, magpapakita ang system ng dialog ng pagpili sa user. Maaaring piliin ng user ang application para sa isang beses na paggamit o magtakda ng default na tagapangasiwa. Simula sa Android 10, ang dialog ng pagpili ay ipinapakita lamang sa unang tawag, pagkatapos ay naaalala ng system ang pagpili ng user.
Para sa pamamahala ng priyoridad ay ginagamit ang attribute na android:priority sa intent-filter tag. Kung mas mataas ang halaga, mas mataas ang priyoridad ng component sa pagresolba ng salungatan. Gayunpaman, hindi gumagana ang priyoridad para sa mga filter mula sa iba't ibang application — sa kasong ito ay palaging ipinapakita ang dialog ng pagpili, kung walang application na nakatakda bilang default.
Ang developer ay maaaring tumawag sa pamamagitan ng programa ng dialog ng pagpili sa pamamagitan ng Intent.createChooser(), na nagpapadala ng target na Intent at pamagat. Ito ay kapaki-pakinabang kapag ang application ay nais na tahasang mag-alok sa user na pumili ng tagapangasiwa, kahit na nakatakda ang isang default na application. Halimbawa, kapag nagpapadala ng mga larawan sa mga social network sa pamamagitan ng ACTION_SEND na may createChooser ay ginagarantiyahan ang pagpapakita ng dialog anuman ang mga default na setting.
Isa sa mga pinakakaraniwang pagkakamali ay ang kawalan ng kategoryang DEFAULT sa Intent Filter. Kinokopya ng mga developer ang configuration mula sa mga halimbawa, ngunit nakakalimutang idagdag ang kategoryang ito, kaya hindi natatanggap ng Activity ang mga implicit na Intent. Hindi nakikita ng system ang filter para sa mga implicit na tawag, kahit na ang tahasang Intent ay patuloy na gumagana.
Ang pangalawang karaniwang pagkakamali ay ang maling pagtukoy ng scheme sa data tag na walang kumpletong URI. Kung ang schema lamang ang tinukoy ngunit hindi ang host, tatanggapin ng filter ang lahat ng link na may ganitong schema mula sa anumang pinagmulan, na maaaring humantong sa mga hindi kanais-nais na tawag mula sa hindi na-verify na mga pinagmulan. Inirerekomenda na palaging tukuyin ang kahit scheme at host.
Ang ikatlong pagkakamali ay ang kawalan ng pagsusuri ng intent.data sa null sa code ng Activity. Kung ang Activity ay inilunsad hindi sa pamamagitan ng deep link, ngunit sa karaniwang paraan mula sa launcher, ang Intent ay hindi naglalaman ng URI. Ang pag-access sa intent.data nang walang pagsusuri ay nagdudulot ng NullPointerException at pag-crash ng application. Palaging gamitin ang intent?.data?.toString() na may safe call operator.
Mga Madalas Itanong
Oo, para sa pagtanggap ng implicit na Intent ang kategoryang DEFAULT ay sapilitan. Kung wala ito, hindi magpapadala ang system ng mga implicit na tawag sa component, at ang Intent Filter ay gagana lamang para sa tahasang Intent na hindi sumusuri ng mga filter.
Walang mga limitasyon. Ang isang Activity ay maaaring maglaman ng anumang bilang ng Intent Filter. Ang bawat filter ay naglalarawan ng hiwalay na senaryo ng pagproseso, halimbawa isang filter para sa deep link, isa pa para sa pagproseso ng file, pangatlo para sa Share Sheet.
Ang Intent Filter ay isang pangkalahatang mekanismo para sa pagproseso ng implicit na Intent. App Link ay isang espesyal na kaso ng Intent Filter na may pag-verify sa pamamagitan ng Digital Asset Links, na awtomatikong nagtatalaga ng application bilang default na tagapangasiwa para sa HTTPS link sa isang tinukoy na domain.
Oo, ang Intent Filter ay maaaring ideklara hindi lamang para sa Activity, kundi pati na rin para sa Service at BroadcastReceiver. Para sa Service, ito ay nagpapahintulot sa paglunsad ng background service mula sa ibang mga application, para sa BroadcastReceiver — pagtanggap ng mga system broadcast message.
Ang MIME type ay tinukoy sa data tag sa pamamagitan ng mga attribute na mimeType. Tinutukoy ng filter kung anong mga uri ng data ang maaaring iproseso ng component — halimbawa, image/* para sa lahat ng larawan o text/plain para sa plain text lamang. Ang mga MIME type ay maaaring pagsamahin sa mga URI schema.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din