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