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返回给调用者,这样一来整个调用过程就完成了。