一张图学习ContentProvider的原理
contentProvider用来向其他组件(本进程或其他进程)提供数据。contentProvider是由binder来实现的。我们知道,binder分为客户端和服务端,具体逻辑在服务端实现,客户端持有服务端的代理,通过调用代理的接口来调用服务端的逻辑。contentProvider也是一样,在其他进程中使用getContentProvider只是获得contentProvider的代理IContentProvider,通过这个代理来调用ContentProvide的方法。
参考下面的图来简要说一下
image.png
1.使用者使用getContentProvider获得IContentProvider对象(ContextProvider的代理),用以进行各种操作。
2.ActivityThread.acquireProvider查询是否已经启动了目标contentProvider,如果已经启动,直接返回IContentProvider对象;如果没有,请求AMS启动目标contentProvider。
3.AMS启动contentProvider所在进程。
3.1调用目标进程中ActivityThread.main方法。main方法中创建ActivityThread实例,创建消息队列,在AMS中绑定自身(通过ApplicationThread)。
4.AMS通过Applicationthread向目标进程发出BIND_APPLICATION通知,目标进程中ActivityThread将将通知转发给消息队列。
5.handler接收消息,创建Application,创建contentProvider,调用application.oncreate方法。
6.AMS向使用者返回IContentProvider对象,使用者使用该对象调用ContentProvider的方法(底层由binder实现)。