ContentProvider的工作原理

366 阅读2分钟

「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战」。

ContentProvider的工作原理

ContentProvider的启动过程

首先,应用程序启动之后,程序的入口就是ActivityThread(这并不是一个线程)的main方法,类似一个java程序中main方法,其也为静态方法,在main方法中,会创建一个具体的ActivityThread对象,通过这个对象可以执行UI相关的代码,同时由之前的知识我们知道,view对事件的具体响应是通过消息队列转移到主线程的,因此这里还需要创建主线程的消息队列,同时为了建立ActivityThread与AMS之间的通信,ActivityThread会将一个Binder接口交给AMS,这是通过AMS的远程代理方法attachApplication来实现的。到这里AMS将会接过对ActivityThread的管理,它会调用ApplicationThread的bindApplication方法,于是在ActivityThread中会先加载ContentProvider,然后创建Application并调用onCreate方法
同样,由于ContentProvider也是可以跨进程访问的,ContentProvider也要将它的Binder接口暴露出来,其它进程则是通过AMS来获得ContentProvider的Binder接口的

ContentProvider的访问过程

接着来看下ContentProvider的访问过程,同样的也是从Context开始的,通过Context的getContentResolver方法,这里会拿到ApplicationContentResolver,如果访问的ContentProvider没有启动,那么就会触发ContentProvider的相应进程的启动。 比如,当我们通过query方法想要访问ContentProvider中的数据时,之前说过CotentProvider会将它的Binder接口暴露,那么此时就应该获得这个接口,它首先会去查询自己的ActivityThread中是否有ContentProvider,如果有的话,就不用去向AMS申请了,如果没有那么就向我们的AMS发送一个跨进程请求,AMS会去启动ContentProvider所在进程,这样就到了ContentProvider的启动过程了,ContentProvider启动并创建之后会将自己的Binder接口发布到AMS中,这样外部进程就可以调用其Binder接口完成ContentProvider的数据的增删改查了

过程总结

这里举数据第一次访问为例 A进程context实例中调用ContentProvider的访问方法 -> AMS -> 具体ContentProvider进程的创建 -> AMS -> A进程