Activity的隱式調(diào)用需要明確指定組件信息。原則一個Intent不應(yīng)該既是顯式又是隱式調(diào)用,如果兩者共存的話以顯式為主。
IntentFilter的過濾信息有action、category、data。一個activity可以有多個intent-filter,一個intent-filter可以有多個action、category、data。只有intent同時匹配這三個過濾信息才能成功啟動目標(biāo)activity。
action:intent中只要跟過濾規(guī)則中的任何一個action相同即可匹配成功,如果沒有任何一個匹配會報ActivityNotFoundException的錯誤,直接crash。區(qū)分大小寫,非中文字符。
category:intent中可以沒有category,一旦intent中有category,無論有幾個,那么都必須在過濾規(guī)則中找到與它一一匹配的category才匹配成功,而action只要找到一個就行。為了activity能夠接收隱式調(diào)用,必須在它的過濾規(guī)則中添加"android.intent.category.DEFAULT"。因為在調(diào)用startActivity或startActivityForResult()時為默認(rèn)加上這個category。
data:有mimeType和URI兩部分組成。mimeType指媒體類型,比如image/jpeg等。而URI的結(jié)構(gòu)為<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>],例如content://com.xxx.mm:8080/folder/subfolder/some,http://www.qq.com:8080/path/add. scheme和host必須指定,否則URI無效。匹配規(guī)則是需要intent中的data和type與過濾規(guī)則中的匹配。給intent指定data和type需要調(diào)用intent.setDataAndType,而setData、setType會批次清除對方的值。注意的是,URI的默認(rèn)值為content和file
通過PackManager的resolveActivity或intent的resolveActivity來判斷隱式intent是否有匹配的activity,找不到匹配的會返回null,這樣判斷能夠防止程序奔潰。