博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android应用程序组件Content Provider的启动过程源代码分析(2)
阅读量:6329 次
发布时间:2019-06-22

本文共 2043 字,大约阅读时间需要 6 分钟。

     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,如需转载请自行联系原作者
你可能感兴趣的文章
美国人的网站推广方式千奇百怪
查看>>
java web学习-1
查看>>
用maven+springMVC创建一个项目
查看>>
linux设备驱动第四篇:以oops信息定位代码行为例谈驱动调试方法
查看>>
redis知识点整理
查看>>
Hello World
查看>>
Spring3全注解配置
查看>>
ThreadLocal真会内存泄露?
查看>>
IntelliJ IDEA
查看>>
低版本mybatis不能用PageHeper插件的时候用这个分页
查看>>
javaweb使用自定义id,快速编码与生成ID
查看>>
[leetcode] Add Two Numbers
查看>>
elasticsearch suggest 的几种使用-completion 的基本 使用
查看>>
04-【MongoDB入门教程】mongo命令行
查看>>
Hadoop HA元数据备份
查看>>
字符串与整数之间的转换
查看>>
断点传输HTTP和URL协议
查看>>
redis 数据类型详解 以及 redis适用场景场合
查看>>
mysql服务器的主从配置
查看>>
巧用AJAX技术,通过updatePanel控件实现局部刷新
查看>>