Step 17. ActivityThread.installProvider
        这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:
  1. public final class ActivityThread {   
  2.     ......   
  3.        
  4.     private final IContentProvider installProvider(Context context,   
  5.             IContentProvider provider, ProviderInfo info, boolean noisy) {   
  6.         ContentProvider localProvider = null;   
  7.         if (provider == null) {   
  8.             ......   
  9.    
  10.             Context c = null;   
  11.             ApplicationInfo ai = info.applicationInfo;   
  12.             if (context.getPackageName().equals(ai.packageName)) {   
  13.                 c = context;   
  14.             } else if (mInitialApplication != null &&   
  15.                 mInitialApplication.getPackageName().equals(ai.packageName)) {   
  16.                     c = mInitialApplication;   
  17.             } else {   
  18.                 try {   
  19.                     c = context.createPackageContext(ai.packageName,   
  20.                         Context.CONTEXT_INCLUDE_CODE);   
  21.                 } catch (PackageManager.NameNotFoundException e) {   
  22.                 }   
  23.             }   
  24.    
  25.             ......   
  26.    
  27.             try {   
  28.                 final java.lang.ClassLoader cl = c.getClassLoader();   
  29.                 localProvider = (ContentProvider)cl.   
  30.                     loadClass(info.name).newInstance();   
  31.                 provider = localProvider.getIContentProvider();   
  32.                 ......   
  33.    
  34.                 // XXX Need to create the correct context for this provider.   
  35.                 localProvider.attachInfo(c, info);   
  36.             } catch (java.lang.Exception e) {   
  37.                 ......   
  38.             }   
  39.    
  40.         } else if (localLOGV) {   
  41.             ......   
  42.         }   
  43.    
  44.         synchronized (mProviderMap) {   
  45.             // Cache the pointer for the remote provider.   
  46.             String names[] = PATTERN_SEMICOLON.split(info.authority);   
  47.             for (int i=0; i<names.length; i++) {   
  48.                 ProviderClientRecord pr = new ProviderClientRecord(names[i], provider,   
  49.                     localProvider);   
  50.                 try {   
  51.                     provider.asBinder().linkToDeath(pr, 0);   
  52.                     mProviderMap.put(names[i], pr);   
  53.                 } catch (RemoteException e) {   
  54.                     return null;   
  55.                 }   
  56.             }   
  57.             if (localProvider != null) {   
  58.                 mLocalProviders.put(provider.asBinder(),   
  59.                     new ProviderClientRecord(null, provider, localProvider));   
  60.             }   
  61.         }   
  62.    
  63.         return provider;   
  64.     }   
  65.    
  66.     ......   
  67. }   
  这个函数的作用主要就是在应用程序进程中把相应的Content Provider类加载进来了,在我们这个种情景中,就是要在ArticlesProvider这个应用程序中把ArticlesProvider这个Content Provider类加载到内存中来了:
  1. final java.lang.ClassLoader cl = c.getClassLoader();   
  2. localProvider = (ContentProvider)cl.   
  3.     loadClass(info.name).newInstance();   
    接着通过调用localProvider的getIContentProvider函数来获得一个Binder对象,这个Binder对象返回给installContentProviders函数之后,就会传到ActivityManagerService中去,后续其它应用程序就是通过获得这个Binder对象来和相应的Content Provider进行通信的了。我们先看一下这个函数的实现,然后再回到installProvider函数中继续分析。
         Step 18. ContentProvider.getIContentProvider
         这个函数定义在frameworks/base/core/java/android/content/ContentProvider.java文件中:
  1. public abstract class ContentProvider implements ComponentCallbacks {   
  2.     ......   
  3.    
  4.     private Transport mTransport = new Transport();   
  5.    
  6.     ......   
  7.    
  8.     class Transport extends ContentProviderNative {   
  9.         ......   
  10.     }   
  11.    
  12.     public IContentProvider getIContentProvider() {   
  13.         return mTransport;   
  14.     }   
  15.    
  16.     ......   
  17. }   
       从这里我们可以看出,ContentProvider类和Transport类的关系就类似于ActivityThread和ApplicationThread的关系,其它应用程序不是直接调用ContentProvider接口来访问它的数据,而是通过调用它的内部对象mTransport来间接调用ContentProvider的接口,这一点我们在下一篇文章中分析调用Content Provider接口来获取共享数据时将会看到。
        回到前面的installProvider函数中,它接下来调用下面接口来初始化刚刚加载好的Content Provider:
  1. // XXX Need to create the correct context for this provider.  
  2. localProvider.attachInfo(c, info);  
        同样,我们先进入到ContentProvider类的attachInfo函数去看看它的实现,然后再回到installProvider函数来。
        Step 19. ContentProvider.attachInfo
        这个函数定义在frameworks/base/core/java/android/content/ContentProvider.java文件中:
  1. public abstract class ContentProvider implements ComponentCallbacks {   
  2.     ......   
  3.    
  4.     public void attachInfo(Context context, ProviderInfo info) {   
  5.         /*  
  6.         * Only allow it to be set once, so after the content service gives  
  7.         * this to us clients can't change it.  
  8.         */   
  9.         if (mContext == null) {   
  10.             mContext = context;   
  11.             mMyUid = Process.myUid();   
  12.             if (info != null) {   
  13.                 setReadPermission(info.readPermission);   
  14.                 setWritePermission(info.writePermission);   
  15.                 setPathPermissions(info.pathPermissions);   
  16.                 mExported = info.exported;   
  17.             }   
  18.             ContentProvider.this.onCreate();   
  19.         }   
  20.     }   
  21.    
  22.     ......   
  23. }   
      这个函数很简单,主要就是根据这个Content Provider的信息info来设置相应的读写权限,然后调用它的子类的onCreate函数来让子类执行一些初始化的工作。在我们这个情景中,这个子类就是ArticlesProvide应用程序中的ArticlesProvider类了。
        Step 20. ArticlesProvider.onCreate
        这个函数定义在前面一篇文章Android应用程序组件Content Provider应用实例介绍的应用程序ArtilcesProvider源代码工程目录下,在文件为packages/experimental/ArticlesProvider/src/shy/luo/providers/articles/ArticlesProvider.java中:
  1. public class ArticlesProvider extends ContentProvider {  
  2.     ......  
  3.   
  4.     @Override  
  5.     public boolean onCreate() {  
  6.         Context context = getContext();  
  7.         resolver = context.getContentResolver();  
  8.         dbHelper = new DBHelper(context, DB_NAME, null, DB_VERSION);  
  9.   
  10.         return true;  
  11.     }  
  12.   
  13.     ......  
  14. }  
        这个函数主要执行一些简单的工作,例如,获得应用程序上下文的ContentResolver接口和创建数据库操作辅助对象,具体可以参考前面一篇文章Android应用程序组件Content Provider应用实例。
        回到前面Step 17中的installProvider函数中,它接下来就是把这些在本地中加载的Content Provider信息保存下来了,以方便后面查询和使用:
  1. synchronized (mProviderMap) {  
  2.     // Cache the pointer for the remote provider.  
  3.     String names[] = PATTERN_SEMICOLON.split(info.authority);  
  4.     for (int i=0; i<names.length; i++) {  
  5.     ProviderClientRecord pr = new ProviderClientRecord(names[i], provider,  
  6.         localProvider);  
  7.     try {  
  8.         provider.asBinder().linkToDeath(pr, 0);  
  9.         mProviderMap.put(names[i], pr);  
  10.     } catch (RemoteException e) {  
  11.         return null;  
  12.     }  
  13.     }  
  14.     if (localProvider != null) {  
  15.     mLocalProviders.put(provider.asBinder(),  
  16.         new ProviderClientRecord(null, provider, localProvider));  
  17.     }  
  18. }  
        和ActivityMangerService类似,在ActivityThread中,以Content Provider的authority为键值来把这个Content Provider的信息保存在mProviderMap成员变量中,因为一个Content Provider可以对应多个authority,因此这里用一个for循环来处理,同时又以这个Content Provider对应的Binder对象provider来键值来把这个Content Provider的信息保存在mLocalProviders成员变量中,表明这是一个在本地加载的Content Provider。

Android应用程序组件Content Provider的启动过程源代码分析(6)相关推荐

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

             通过前面的学习,我们知道在Android系统中,Content Provider可以为不同的应用程序访问相同的数据提供统一的入口.Content Provider一般是运行在独立的进 ...

  2. Android应用程序组件Content Provider的共享数据更新通知机制分析

    在Android系统中,应用程序组件Content Provider为不同的应用程序实现数据共享提供了基础设施,它主要通过Binder进程间通信机制和匿名共享内存机制来实现的.关于数据共享的另一个 话 ...

  3. Android应用程序组件Content Provider在应用程序之间共享数据的原理分析(1)

             在Android系统中,不同的应用程序是不能直接读写对方的数据文件的,如果它们想共享数据的话,只能通过Content Provider组件来实现.那么,Content Provide ...

  4. Android应用程序组件Content Provider的共享数据更新通知机制分析(3)

            3. 数据更新通知的发送过程        在前面这篇文章Android应用程序组件Content Provider应用实例介绍的应用程序Acticle中,当调用ArticlesAda ...

  5. Android系统默认Home应用程序(Launcher)的启动过程源代码分析

    在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应 ...

  6. Android系统默认Home应用程序(Launcher)的启动过程源代码分析(3)

    Step 13.  ActivityStack.startActivityLocked 这个函数定义在frameworks/base/services/java/com/android/server/ ...

  7. Android应用程序组件Content Provider简要介绍和学习计划

    在Android系统中,Content Provider作为应用程序四大组件之一,它起到在应用程序之间共享数据的作用,同时,它还是标准的数据访问接口.前面的一系列文章已经分析过Android应用程序的 ...

  8. Android应用程序组件Content Provider在应用程序之间共享数据的原理分析(2)

        Step 7. ContentProviderProxy.query       这个函数定义在frameworks/base/core/java/android/content/Conten ...

  9. Android系统默认Home应用程序(Launcher)的启动过程源代码分析(2)

    Step 10.  ActivityManagerService.systemReady 这个函数是在上面的Step 6中的ServerThread.run函数在将系统中的一系列服务都初始化完毕之后才 ...

最新文章

  1. 文件查找命令find的使用
  2. 主题模型简介(Topic Models)
  3. python解密md5值_Python之POST提交解密MD5
  4. linux局域网内根据ip查询主机名
  5. UI5 Source code map机制的细节介绍
  6. 多看 android6,多看阅读本地版
  7. 剑指offer——二进制中1的个数(c++)
  8. c语言 谭浩强 一维数组内放10个学生成绩 全局变量写一个函数 最高分、最低分、平均分...
  9. TP框架控制器的空操作
  10. 【死磕 Spring】—– IOC 之 bean 的初始化
  11. log4j 配置文件路径问题
  12. PKPM200608/CARD-1 8.0/TPM5000/神机妙算(黄狗)/桥梁通7.09/福莱一点通8.3/纬地5.82
  13. 编码通信与魔术初步(六)——经典魔术《傅氏幻术》赏析和《我的心灵感应》...
  14. Cherno C++ P61 C++的命名空间
  15. 《CISCO交换机常用命令》——【思科交换机配置及维护技能】
  16. ActiveX 暴漏你所有信息的可怕的插件!
  17. 数据可视化----常用图表样式
  18. 微信小程序参数传递获取当前页面的url和参数
  19. ubuntu执行uci出现 uci: error while loading shared libraries: lib
  20. R pdf大小_免费、开源、多平台支持的PDF文档处理软件 PDFsam Basic

热门文章

  1. html随机播放不同的音乐,如何随机播不同的背景音乐
  2. linux遍历文件夹下所有文件大小,Linux系统遍历文件夹 获取文件大小的操作(C语言实现)...
  3. Paddle 环境中 使用LeNet在MNIST数据集实现图像分类
  4. 几款高频环形磁芯的性能对比
  5. 新学期伊始,同学们就开始为十六届智能车竞赛出谋划策了
  6. Several ports (8005, 8080, 8009) required by Tomcat v5.5 Server at localhost are already in use.....
  7. python accept解析_python中requests库使用方法详解
  8. 东莞厚街工业机器人展会_工业机器人四大家族齐聚!东莞将在12月举办智博会...
  9. php指针注意问题,c语言指针注意问题
  10. Java高级技术笔记