什么是Intent ? Intent是一種運(yùn)行時(shí)綁定(runtime binding)機(jī)制,它能在程序運(yùn)行的過(guò)程中連接兩個(gè)不同的組件。通過(guò)Intent,你的程序可以向Android表達(dá)某種請(qǐng)求或者意愿,Android會(huì)根據(jù)意愿的內(nèi)容選擇適當(dāng)?shù)慕M件來(lái)響應(yīng)。比如,有一個(gè)Activity希望打開網(wǎng)頁(yè)瀏覽器查看某一網(wǎng)頁(yè)的內(nèi)容,那么這個(gè)Activity只需要發(fā)出WEB_SEARCH_ACTION請(qǐng)求給Android,Android 會(huì)根據(jù)Intent的內(nèi)容,查詢各組件注冊(cè)時(shí)的聲明的IntentFilter,找到網(wǎng)頁(yè)瀏覽器Activity來(lái)瀏覽網(wǎng)頁(yè)。 Android有三個(gè)基本組件--Activity,Service,BroadcastReceiver,它們都是通過(guò)Intent機(jī)制激活的,而不同類型的組件有不同的傳遞Intent的方式。 1.要激活一個(gè)新的Activity,或者讓現(xiàn)有的Activity執(zhí)行新的操作,可以通過(guò)調(diào)用Context.startActivity()或者Activity.startActivityForResult()方法。這兩個(gè)方法需要傳入的Intent參數(shù)也稱為Activity Action Intent,根據(jù)Intent對(duì)象對(duì)目標(biāo)Activity描述的不同,來(lái)啟動(dòng)與之匹配的Activity或傳遞信息。 2.要啟動(dòng)一個(gè)新的服務(wù)或者向一個(gè)已有的服務(wù)傳遞新的指令,調(diào)用Context.startService()方法或者調(diào)用Context.bindService()方法將調(diào)用此方法的上下文對(duì)象與Service綁定。 3.通過(guò)Context.sendBroadcast()、Context.sendOrderBroadcast()和Context.sendStickBroadcast()這三個(gè)方法可以發(fā)送BroadcastIntent。BroadcastIntent發(fā)送后。所有已注冊(cè)的擁有與之相匹配的IntentFilter的BroadcastReceiver就會(huì)被激活。這種機(jī)制廣泛運(yùn)用于設(shè)備和系統(tǒng)狀態(tài)變化的通知。一個(gè)常見(jiàn)的例子是,當(dāng)Android的電池電量過(guò)低時(shí),系統(tǒng)就會(huì)發(fā)送Action為BATTERY_LOW的廣播,接著任何可匹配該Action的IntentFilter注冊(cè)的BroadcastReceiver都會(huì)各自運(yùn)行自己自定義的處理代碼,比如關(guān)閉設(shè)備的WIFI和GPS以節(jié)省電量。 Intent一旦發(fā)出,Android都會(huì)準(zhǔn)確的找到相匹配的一個(gè)或多個(gè)Activity、Service或BroadcastReceiver作為響應(yīng)。所以不同類型的Intent消息不會(huì)發(fā)生重疊:BroadcastIntent消息只會(huì)發(fā)送給BroadcastReceiver,由startActivity()傳遞的消息只能送給Activity,由startService()傳遞的Intent只能發(fā)送給service。 如何解析Intent 對(duì)于明確指出了目標(biāo)組件名稱的Intent,我們稱之為“顯式Intent”,對(duì)于沒(méi)有明確指出目標(biāo)組件名稱的Intent,我們稱之為“隱式Intent”。Android系統(tǒng)使用IntentFilter來(lái)尋找與隱式Intent相關(guān)的對(duì)象。 IntentFilter 應(yīng)用程序的組件為了告訴Android自己能響應(yīng)、處理哪些隱式Intent請(qǐng)求,可以聲明一個(gè)甚至多個(gè)IntentFilter。 <intent-filter> <action android:name="android.Intent.Action.MAIN"/> <category android:name="android.Intent.Category.LAUNCHER"/> </intent-filter> |
|