本片部落格對應時序圖上的step1—5:下接第二篇contentprovider啟動流程分析二!
作為安卓設計的四大元件之一,是跨程序共享資料的一把利器,所謂跨程序共享資料,通俗理解就是,應用程式a可以訪問操作應用程式b共享出來的資料,這些共享出來的資料一般都有其對應的uri(統一資源識別符號),那麼就涉及到兩個過程:
提供資料內容的過程:
發出訪問資料請求的過程:
再來結合原始碼分步梳理一遍詳細經過,對應時序圖的step1-->step5,過程如下:
時序圖step1 --> context#getcontentresolver()context mbase;
....
@override
public contentresolver getcontentresolver()
....
}contextimpl類的成員函式getcontentresolver()原始碼如下:
....
....
/*建構函式*/
private contextimpl(contextimpl container, activitythread mainthread,
loadedapk packageinfo, ibinder activitytoken, userhandle user, boolean restricted,
display display, configuration overrideconfiguration, int createdisplaywithid)
/*返回contentresolver物件*/
@override
public contentresolver getcontentresolver()
}也就是獲得與contactscontract.commondatakinds.phone.content_uri聯絡人資料uri對應的乙個contentprovider元件物件。
時序圖step2,3 --> contentresolver#acquireprovider()private final activitythread mmainthread;
....
context context, activitythread mainthread, userhandle user)
@override
protected icontentprovider acquireprovider(context context, string auth)
}在函式acquireprovider內部,其實呼叫的是activitythread類的成員函式acquireprovider(),這個函式會返回乙個contentprovider元件的**物件,而這個**物件**的,正是聯絡人資料uri對應的contentprovider元件!
時序圖step4—5 --> activitythread#acquireprovider()/acquireexistingprovider()接下來看activitythread類的acquireprovider()函式的原始碼如下:
public final class activitythread
....
iactivitymanager.contentproviderholder holder = null;
try ....
holder = installprovider(c, holder, holder.info,
true /*noisy*/, holder.noreleaseneeded, stable);
return holder.provider;
}....
public final icontentprovider acquireexistingprovider(
context c, string auth, int userid, boolean stable)
icontentprovider provider = pr.mprovider;
ibinder jbinder = provider.asbinder();
providerrefcount prc = mproviderrefcountmap.get(jbinder);
if (prc != null)
return provider;}}}
然後按照函式執行的先後順序,分為兩個片段,先分析activitymanagerservice**物件(記作activitymanagerproxy)的成員函式getcontentprovider()的具體實現(對應時序圖step6—19),然後再分析activitythread類的成員函式installprovider()的具體實現(對應時序圖step20)。 如何新增Content Provider
一 寫在前面 一直很好奇系統是如何通過 content 來訪問歸屬地資料庫的,通過研究 和api參考文件以及網路上的資料基本上弄明白了,於是有了以下的內容。二 android content provider介紹 三 content provider的組成 四 新增content provider ...
ContentProvider基本使用
在不同應用之間實現資料共享,並保證安全性 比較 新增 沒有條件約束,刪除 沒有資料contentvalues getcontentresolver insert uri uri,contentvalues values getcontentresolver update uri uri,conten...
ContentProvider簡單使用
一是使用內容提供器讀取和操作其他應用程式的資料 二是建立內容提供器給該程式的資料提供外部訪問介面 如 簿,簡訊,庫,都有內容提供器讓它們的資料有外部訪問介面 內容提供器提供的資料外部訪問介面是乙個uri.它由authority和path組成 path相當於不同的表加在authority的後面。如有表...