ContentProvider
是内容提供者,可以跨进程提供数据。
大家都知道,ContentProvider
的启动,是在Application的onCreate
方法之前的,所以ContentProvider
的初始化时间会影响整个App的启动速度。
那ContentProvider
启动流程具体是什么样的呢?让我们进入源码的世界来一探究竟。
App启动
App启动时,AMS会通过跨进程Binder
调用,访问到ApplicationThread
种的bindApplication
方法。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
这个方法主要作用是,拼接AppBindData
,发送给ActivityThread
中的Handler mH
。在这个Handler
中,会处理Message
,然后调用handleBindApplication(data)
方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
这个方法非常长,主要做的事情有以下四点:
- 创建一个
ContentImpl
对象 - 创建一个
Instrument
对象 - 创建
Application
实例 - 如果不是
backup
模式,调用installContentProviders
,启动ContentProvider
- 调用
Application
的onCreate
方法
installContentProviders
1 2 3 4 5 6 7 8 9 10 11 12 |
|
这个方法,循环遍历所有待启动的ContentProvider
,调用installProvider
启动。
1 2 3 4 5 6 7 8 9 10 11 |
|
这个方法,通过反射创建ContentProvider
,然后调用attachInfo
方法。
1 2 3 4 |
|