从App启动理解ContentProvider的创建
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从App启动理解ContentProvider的创建相关的知识,希望对你有一定的参考价值。
参考技术A我们知道app的启动是从 ActivityThread.main 方法开始的,所以我们先从 main 看起
main 方法里主要做了三件事
接下来我们看 ActivityThread.attach 方法
attach 方法里主要做里就是调用 ActivityManager.getService() 方法返回 IActivityManager 类型的 Binder 对象, 具体实现是在AMS里实现 attachApplication
可以发现 attachApplication 实际调用了 attachApplicationLocked ,而在 attachApplicationLocked 里又通过 IApplicationThread (其类型是 ApplicationThread 是 ActivityThread 的内部类,继承自 IApplicationThread.Stub ) 的 bindApplication 方法
bindApplication 最终调用了 mH.sendMessage 方法,因为AMS通过 ApplicationThread 回调到我们的进程,这也是一次跨进程过程,而 ApplicationThread 就是一个 binder ,回调逻辑是在 binder 线程池中完成的,所以需要通过 Handler 将其切换到ui线程.所以这里调用 mh.sendMessage ( mh 是 ActivityThread 的内部类 H 的一个实例)来通知处理 BIND_APPLICATION 事件
可以看到 Handler.H 收到 BIND_APPLICATION 事件后实际调用来 handleBindApplication 方法来完成 Application 的创建以及 ContentProvider 的创建
AppComponentFactory.instantiateApplication
经过 上面的5个步骤就完成了Application的创建和启动,可以看到在第5步调用 Application 的 onCreate 方法之前,第4步进行了 ContentProvicer 的创建和调用其 onCreate ,这里就解释到了为什么可以在 ContentProvicer.onCreate 里初始化sdk,下面介绍下 ContentProvicer 的创建和调用其 onCreate
installContentProviders 完成了 ContentProvider 的启动,它首先遍历当前进程的 ProviderInfo 列表并一一调用其 installProvder 方法来启动它,接着将已启动的 ContentProvider 发布到AMS上,AMS会把它们存在 ProviderMap 里,这样外部调用者就可以直接从AMS中获取到 ContentProvider
这里通过类加载器完成了 ContentProvider 的创建
在 installProvider 方法里除了完成了 ContentProvider 的创建还掉用了 attachInfo ,在改方法里来调用它的 onCreate 方法。到此位置 ContentProvider 的创建已经完成,并且它的 onCreate 也被调用
以上是关于从App启动理解ContentProvider的创建的主要内容,如果未能解决你的问题,请参考以下文章
Android动态部署六:如何从插件apk中启动BroadcastReceiver和ContentProvider
Android动态部署六:如何从插件apk中启动BroadcastReceiver和ContentProvider
Android深入四大组件Content Provider的启动过程