Android应用程序组件Content Provider的启动过程源代码分析(2)

     Step 5. ActivityThread.getProvider
         这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:
  1. public final class ActivityThread {  
  2.     ......  
  3.   
  4.     private final IContentProvider getExistingProvider(Context context, String name) {  
  5.         synchronized(mProviderMap) {  
  6.             final ProviderClientRecord pr = mProviderMap.get(name);  
  7.             if (pr != null) {  
  8.                 return pr.mProvider;  
  9.             }  
  10.             return null;  
  11.         }  
  12.     }  
  13.   
  14.     ......  
  15.   
  16.     private final IContentProvider getProvider(Context context, String name) {  
  17.         IContentProvider existing = getExistingProvider(context, name);  
  18.         if (existing != null) {  
  19.             return existing;  
  20.         }  
  21.   
  22.         IActivityManager.ContentProviderHolder holder = null;  
  23.         try {  
  24.             holder = ActivityManagerNative.getDefault().getContentProvider(  
  25.                 getApplicationThread(), name);  
  26.         } catch (RemoteException ex) {  
  27.         }  
  28.   
  29.         IContentProvider prov = installProvider(context, holder.provider,  
  30.             holder.info, true);  
  31.   
  32.         ......  
  33.   
  34.         return prov;  
  35.     }  
  36.   
  37.     ......  
  38. }  
 
         这个函数首先会通过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文件中:
  1. public final class ActivityManagerService extends ActivityManagerNative  
  2.         implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {  
  3.     ......  
  4.   
  5.     public final ContentProviderHolder getContentProvider(  
  6.             IApplicationThread caller, String name) {  
  7.         ......  
  8.   
  9.         return getContentProviderImpl(caller, name);  
  10.     }  
  11.   
  12.     ......  
  13. }  
        它调用getContentProviderImpl函数来进一步执行操作。
 




本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966982,如需转载请自行联系原作者
上一篇:使用新版Android Studio检测内存泄露和性能


下一篇:光影中的十大非常学校