从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的启动过程

ContentProvider的理解与使用

如何从外部应用访问另一个应用中的contentprovider

ContentProvider的启动流程分析