Step 5. ActivityThread.getProvider
这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:
-
public final class ActivityThread {
-
......
-
-
private final IContentProvider getExistingProvider(Context context, String name) {
-
synchronized(mProviderMap) {
-
final ProviderClientRecord pr = mProviderMap.get(name);
-
if (pr != null) {
-
return pr.mProvider;
-
}
-
return null;
-
}
-
}
-
-
......
-
-
private final IContentProvider getProvider(Context context, String name) {
-
IContentProvider existing = getExistingProvider(context, name);
-
if (existing != null) {
-
return existing;
-
}
-
-
IActivityManager.ContentProviderHolder holder = null;
-
try {
-
holder = ActivityManagerNative.getDefault().getContentProvider(
-
getApplicationThread(), name);
-
} catch (RemoteException ex) {
-
}
-
-
IContentProvider prov = installProvider(context, holder.provider,
-
holder.info, true);
-
-
......
-
-
return prov;
-
}
-
-
......
-
}
这个函数首先会通过getExistingProvider函数来检查本地是否已经存在这个要获取的ContentProvider接口,如果存在,就直接返回了。本地已经存在的ContextProvider接口保存在ActivityThread类的mProviderMap成员变量中,以ContentProvider对应的URI的authority为键值保存。在我们这个情景中,因为是第一次调用ArticlesProvider接口,因此,这时候通过getExistingProvider函数得到的IContentProvider接口为null,于是下面就会调用ActivityManagerService服务的getContentProvider接口来获取一个ContentProviderHolder对象holder,这个对象就包含了我们所要获取的ArticlesProvider接口,在将这个接口返回给调用者之后,还会调用installProvider函数来把这个接口保存在本地中,以便下次要使用这个ContentProvider接口时,直接就可以通过getExistingProvider函数获取了。
我们先进入到ActivityManagerService服务的getContentProvider函数中看看它是如何获取我们所需要的ArticlesProvider接口的,然后再返回来看看installProvider函数的实现。
Step 6. ActivityManagerService.getContentProvider
这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:
-
public final class ActivityManagerService extends ActivityManagerNative
-
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
-
......
-
-
public final ContentProviderHolder getContentProvider(
-
IApplicationThread caller, String name) {
-
......
-
-
return getContentProviderImpl(caller, name);
-
}
-
-
......
-
}
它调用getContentProviderImpl函数来进一步执行操作。
本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966982,如需转载请自行联系原作者