本文共 2043 字,大约阅读时间需要 6 分钟。
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); -
-
-
-
-
-
-
-
-
-
private final IContentProvider getProvider(Context context, String name) { -
IContentProvider existing = getExistingProvider(context, name); -
-
-
-
-
IActivityManager.ContentProviderHolder holder = null; -
-
holder = ActivityManagerNative.getDefault().getContentProvider( -
getApplicationThread(), name); -
} catch (RemoteException ex) { -
-
-
IContentProvider prov = installProvider(context, holder.provider, -
-
-
-
-
-
-
-
-
这个函数首先会通过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,如需转载请自行联系原作者