2

這是一個深奧的魔法問題。 我知道對ContentResolver方法的調用需要一個特定於ContentProvider的URI,但是android實際上是如何實現關聯的?ContentResolver如何找到相應的ContentProvider?

我猜測任何與AndroidManifest.xml中的ContentProvider提供的權限相匹配的URI都會涉及。 請求是否發送給每個包含該權限的提供者? 如果我嘗試創建權威前綴爲另一個權威的提供者會是一個問題嗎?

有沒有辦法,看看是否ContentProvider的運行?我想在getType()方法上可能會出現一個虛擬響應,表示活躍。

+0

http://developer.android.com/guide/topics/providers/content-providers.html#urisum解釋瞭如何使用該機構從uri中識別聯繫人提供商。我的問題的第二部分仍然是相關的,當有一個名字重疊/擴展會發生什麼? – phreed 2011-01-06 18:52:10

回答

6

ContentResolver維護從內容授權到ContentProvider類的映射。該映射的數據來自各種已安裝應用程序的AndroidManifest.xml文件的<provider>元素。 ContentResolver使用這個映射來確定哪個Provider類是適用於給定的URI的正確的一個。將ContentResolver想象成有點像DNS。它計算出哪個服務器(提供商)是正確的回答您的查詢。

只有一個ContentProvider會匹配,因爲contentAuthorities(內容:類型uri的「域名」部分)必須是唯一的。它們不是分層的。將它們視爲必須完全匹配的唯一字符串。他們看起來層次分明的原因是允許保證唯一性的簡單方法,類似於確保Java包名稱是唯一的。

每「說明:」部分爲 tag documentation

Android系統由 內容的授權部分 提供商標識內容:URI例如,假設 下列URI被傳遞到 ContentResolver.query():

content://com.example.project.healthcareprovider/nurses/rn

內容:方案標識 數據屬於內容 提供者和權威 (com.example.project.healthcareprovider) 標識特定提供者。 因此,該權限必須是 的唯一。通常,如本例中的 這是 ContentProvider子類的完全限定名稱。 URI的路徑 部分可以由內容 提供商用來識別特定的數據 子集,但這些路徑都在清單中不是

至於當你犯了一個供應商,具有contentAuthority會發生什麼聲明 這與另一個是相同的......好吧,東西休息。具體來說,它會拒絕安裝在第二取其包得好,他說:

WARN/PackageManager:不能安裝,因爲供應商名稱com.xxx.Provider (封裝com.xxx)已經由COM .zzz

所以....不要這樣做。

沒有辦法,看看是否ContentProvider的運行。它根據需要由ContentResolver自動啓動和停止。當您開始請求特定的contentAuthority時,關聯的提供程序將在它尚未運行時啓動。它會自動通過ContentResolver的一段時間後,一旦空閒坐在停止,而且看起來可能並不需要有一段時間。

相關問題