學(xué)習(xí)了ContentProvider,想做個通訊錄,結(jié)果在Intent和getType(Uri uri)上卡住了,經(jīng)過查找資料發(fā)現(xiàn)了問題的所在。在這里解釋下getType(Uri uri)何時被調(diào)用,和android.intent.category.DEFAULT 的理解。 我們需要什么時候加android.intent.category.DEFAULT呢? 1、要弄清楚這個問題,首先需要弄明白什么是implicit(隱藏) intent什么是explicit(明確) intent。 Explicit Intent明確的指定了要啟動的Acitivity ,比如以下Java代碼: Implicit Intent沒有明確的指定要啟動哪個Activity ,而是通過設(shè)置一些Intent Filter來讓系統(tǒng)去篩選合適的Acitivity去啟動。 2、intent到底發(fā)給哪個activity,需要進(jìn)行三個匹配,一個是action,一個是category,一個是data。 理論上來說,如果intent不指定category,那么無論intent filter的內(nèi)容是什么都應(yīng)該是匹配的。但是,如果是implicit intent,android默認(rèn)給加上一個CATEGORY_DEFAULT,這樣的話如果intent filter中沒有android.intent.category.DEFAULT這個category的話,匹配測試就會失敗。所以,如果你的 activity支持接收implicit intent的話就一定要在intent filter中加入android.intent.category.DEFAULT。 例外情況是:android.intent.category.MAIN和android.intent.category.LAUNCHER的filter中沒有必要加入android.intent.category.DEFAULT,當(dāng)然加入也沒有問題。 我們定義的activity如果接受implicit intent的話,intent filer就一定要加上android.intent.category.DEFAULT這個category。 我的問題就是出現(xiàn)在這里。忘記在intent-filter中加上了<category android:name="android.intent.category.DEFAULT" />了這個。
getType(uri uri)這個方法何時被調(diào)用呢? 當(dāng)我們在程序中需要啟動例外的activity時,很多時候我們是使用的隱式調(diào)用,即我們不直接指定要跳轉(zhuǎn)的Activity,而是為Intent提供一些相關(guān)的參數(shù),讓其自動去和AndroidManifest.xml中已有的Activity去匹配,而IntentFilter(Intent 過濾器)在xml中有三個主要的參數(shù):action,categary,data。 我們通過Intent的構(gòu)造函數(shù)或者Intent提供的方法可以指定這個三個參數(shù),如方法有: intent.setAction(action); 等,比如在記事本程序中有: <intent-filter android:label="@string/resolve_edit"> 我們很容易看出action和category是很容易匹配的,而我們傳的Uri的數(shù)據(jù)怎么匹配呢,這是系統(tǒng)會去調(diào)用你定義的ContentProvider中的getType,取得相關(guān)的返回值來和上面的data串進(jìn)行匹配,當(dāng)然getType的返回結(jié)果你是需要自己去定義的。 但在程序中你也可以自己知道data的類型,就直接匹配了:intent.setType(type); 標(biāo)簽: android |
|