这一篇,没营养,凑数用的。
1. ActivityThread的main方法
- 我们知道android应用程序的入口是ActivityThread的main方法。
- ContentProvid是何时、何流程,调用的onCreate方法呢?
ActivityThread的main方法说起。
|
|
在main方法中,我们能发现如上代码,attach什么?我们跟进去看。
|
|
我们的应用程序,会走这个if分支,从方法名我们能看出来,原来是将ApplicationThread和Applicatin关联起来,我们继续看,在ams的attachApplication方法中,会调用attachApplicationLocked,去做关联。继续看这个方法,会发现
|
|
- app ProcessRecord, 进程相关信息
- ProviderInfo contentprovider信息
再然后,我们会发现,调用ApplicationThread#bindApplication方法,在这个方法中发送消息,我们的H类,调用handleBindApplication去处理。在这个方法中有如下代码:
|
|
找了半天,总算看到了相关的内容。这个installContentProviders就是用来装载ContentProvider的。
|
|
总体分为两步,
- installProvider 生成ContentProviderHolder对象
- publishContentProviders 发布出去
2.installProvider
|
|
在这块的代码中,会生成ContentProvider对象,并且调用attachInfo方法。在attachInfo方法中,我们就能发现
|
|
3.query操作
Context的实现类是ContextImpl,通过观察代码,我们能够发现,mContentResolver的类型是ApplicationContentResolver,这个类实现类ContentResolver的一些抽象方法。
query方法也比较复杂,涉及到应用计数的问题,我看不太懂。建议看这个理解ContentProvider原理
- 获取IContentProvider对象
- IContentProvider的query方法
IContentProvider在这里的实现是什么呢?这个在ActivityThread的installProvider方法里能找到。
|
|
cp的getIContentProvider返回mTransport,是一个Transport的实例,在它的query方法中,调用了cp的query。