顯式Intent:通過指定Intent組件名稱來實現(xiàn)的,它一般用在知道目標(biāo)組件名稱的前提下,去調(diào)用Intent.setComponent()、Intent.setClassName()或Intent.setClass()方法或者在new Intent(A.this,B.class)指明需要轉(zhuǎn)向到的Activity,顯式意圖明確指定了要激活的組件是哪個組件,一般是在應(yīng)用程序內(nèi)部使用。
隱式Intent:通過在清單文件中配置IntentFilter來實現(xiàn)的,它一般用在沒有明確指出目標(biāo)組件名稱的前提下,當(dāng)一個應(yīng)用要激活另一個應(yīng)用中的Activity時(看不到源代碼),只能使用隱式意圖,根據(jù)Activity配置的意圖過濾器建一個意圖,讓意圖中的各項參數(shù)的值都跟過濾器匹配,這樣就可以激活其他應(yīng)用中的Activity。Android系統(tǒng)會根據(jù)隱式意圖中設(shè)置的動作(action)、類別(category)、數(shù)據(jù)(URI和數(shù)據(jù)類型)找到最合適的組件來處理這個意圖。一般是用于在不同應(yīng)用程序之間,如果想隱式intent不可以被跨應(yīng)用啟動只需要在AndroidManifest.xml對應(yīng)的activity中配置android:exported="false"即可。
使用隱式intent啟動activity的時候如果有兩個action配置是一樣的,那么啟動的時候系統(tǒng)就會彈出對話框讓你選擇去啟動哪一個,那么怎么過濾掉自己不想啟動的哪一個呢,可以自定義URL使用Scheme方式喚起Activity或App,這樣就可以對同一個action進行區(qū)分了!
顯示intent效率高,系統(tǒng)直接精確定位要啟用的組件,但耦合度也高,如果通過這種方式調(diào)用一些系統(tǒng)組件的話,容易因為版本更新,類名、包名、包結(jié)構(gòu)變化等原因?qū)е鲁绦虮罎ⅰk[式意圖能夠降低程序的耦合度,但由于每次意圖執(zhí)行的時候,系統(tǒng)都會搜索所有可用的intentfilter,來查看是否有匹配的內(nèi)容,所以效率更低。 |
|