ContentProvider啟動流程分析(一)

2022-07-13 18:57:14 字數 2528 閱讀 3341

本片部落格對應時序圖上的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的後面。如有表...