ContentProvider启动过程(通过query方法触发)

ContentProvider.acquireProvider-->

ApplicationContentResolver.acquireProvider-->

ActivityThread.acquireProvider-->

ActivityManagerService.startProcessLocked-->

ActivityThread.main-->

ActivityThread.attach-->

ActivityManagerService.attachApplication-->

ActivtiyManagerService.attachApplicationLocked-->

ApplicationThread.bindApplicatoin-->

ActivityThread.handleBindApplication-->

handleBindApplication完成了Application的创建以及ContentProvider的创建,四个步骤

1)创建ContextImpl和Instrumentation

2)创建Application对象

3)启动当前进程的ContentProvider并调用其onCreate方法

4)调用Application的onCreate方法

No1:

ContentProvider所在进程启动时,ConentProvider会同时启动并将发布到AMS中。

这个时候ContentProvider的onCreate要先于Application的onCreate而执行。

No2:

可以认为ContentProvide都是单实例的

No3:

访问ContentProvider需要通过ContentResolver,ContentResolver是一个抽象类,通过Context的getContentResolver方法获取的实际上是ApplicationContentResolver对象,ApplicationContentResolver类继承了ContentResolver并实现了ContentResolver中的抽象方法。

No4:

其他应用通过AMS来访问ContentProvider(实际是ContentProvider的Binder对象IContentProvider),而IContentProvider的实现者实际上是ContentProvider.Transport。因此其他应用调用IContentProvider的query方法最终会以进程间通信的方式调用ContentProvider.Transport的query方法。然后调用的就是ContentProvider的query方法,query方法的执行者再通过Binder返回给调用者,这样一来整个调用过程就完成了。