ContentProvider在AMS中相关的数据结构

2020-03-10  本文已影响0人  泡面先生_Jack

ContentProvider数据结构

ContentProvider_ams.png

应用进程端数据结构

1. ContentProvider

ContentProvider组件,我们要实现一个ContentProvider需要继承它,实现完成之后本进程或者其他进程就可以调用它都增删改查都接口了.

Transport mTransport : 继承了ContentProviderNative, ContentProviderNative又继承了Binder类,实现了IContentProvider接口,所以mTransport实现了IContentProvider的Binder服务端,其他地方(也可能是跨进程)调用ContentProvider的时候直接调用到Transport类中。

2. ProviderClientRecord

ProviderClientRecord描述了应用进程中一个ContentProvider的信息
mProvider :指向了ContentProvider的Transport对象
mLocalProvider: 指向了对应的ContentProvider对象

3. ActivityThread中如何保存ContentProvider信息

    // The lock of mProviderMap protects the following variables.
    final ArrayMap<ProviderKey, ProviderClientRecord> mProviderMap
        = new ArrayMap<ProviderKey, ProviderClientRecord>();
    final ArrayMap<IBinder, ProviderRefCount> mProviderRefCountMap
        = new ArrayMap<IBinder, ProviderRefCount>();
    final ArrayMap<IBinder, ProviderClientRecord> mLocalProviders
        = new ArrayMap<IBinder, ProviderClientRecord>();
    final ArrayMap<ComponentName, ProviderClientRecord> mLocalProvidersByName
            = new ArrayMap<ComponentName, ProviderClientRecord>();

mProviderMap : 以ProviderKey为Key保存了App端所有运行的ContentProvider信息
mProviderRefCountMap : 记录了App端所有ContentProvider的引用信息
mLocalProviders : 以ContentProvicer的Binder为key,保存了App端所有的ContentProvider信息
mLocalProvidersByName : 以CompomentName为key,保存了App端所有端ContentProvider信息

AMS端的数据结构

1. ContentProviderRecord

在AMS服务中来描述一个ContentProvider信息,对应于App端的一个ProviderClientRecord。

2. ContentProviderConnection

连接contentProvider与请求该provider所对应的进程

provider : 目标Provider所对应的ContentProviderRecord结构体
client : 请求Provider的客户端进程

3. ProviderMap

记录了系统中所有发布的Provider信息

mProvidersByNamePerUser : 按照Provider的名字为Key, 记录了所有Provider信息
mProvidersByClassPerUser : 按照CompomentName为key, 记录了所有Provider信息

4. ProcessRecord

    // class (String) -> ContentProviderRecord
    final ArrayMap<String, ContentProviderRecord> pubProviders = new ArrayMap<>();
    // All ContentProviderRecord process is using
    final ArrayList<ContentProviderConnection> conProviders = new ArrayList<>();

pubProviders: 记录了当前进程所有已经发布的Provider信息
conProviders : 记录了当前进程和其他进程所建立的连接

上一篇下一篇

猜你喜欢

热点阅读