您的位置:首页资讯其它软件 → 用android的content provider实例源码

用android的content provider实例源码

时间:2011/7/10 11:46:20来源:本站原创作者:清晨我要评论(0)

  在Android下,查询联系人、通话记录等,需要用到content provider。但是,调用content provider时,Android框架内部是如何做的呢?

下面调用所采用的开发环境及源码都是基于Android 1.6版本。

  • 概述
       总的来说此问题分为两个步骤: 
  1. 初始化content provider。这一阶段主要是参照AndroidManifest.xml,初始化content provider。注意这里只有当包含content provider的进程运行的时候,才会对该进程内所有的content provider进行初始化。其它provider是按需初始化的(后续文章会介绍该问题)。  
  2. 调用content provider,进行数据库操作。这个调用通常发生在用户定义的Activity子类的相关接口内。调用时,首先会获取对应的content provider对象(有可能是代理对象)。然后,再调用(直接调用或者通过IBinder接口)。
       本文主要探讨第一个问题:初始化content provider。
  • 应用进程的管理模型

       Android框架内,应用程序Java代码的入口为ActivityThread.main。用来管理不同的应用的服务为ActivityManagerService。它的模型大致为:


       左边为多个应用进程,每个进程中有个主线程ActivityThread.main,Looper.loop()是主线程的消息循环。所有的应用进程都是通过IBinder机制和ActivityManagerService进程进行交互的。为了能互相调用,设置了两个类:ActivityManagerNative作为客户端,用于调用ActivityManagerService中的方法。而ApplicationThread则作为服务端,暴露接口IApplicationThread供ActivityManagerService调用。ApplicationThread的作用主要是向主线程的消息循环发送特定的消息,保证ActivityManagerService的调用是异步的。

       右边的ActivityManagerService是所有应用的服务进程,用于管理应用进程。启动新的应用进程时,会向zygote服务进程发送socket消息。zygote接收到消息后,则会启动新的delvik虚拟机,然后运行ActivityThread.main,启动新的应用。

  • PackageManagerService

       PackageManagerService也是一个服务,是用来管理手机内所有的apk包的。调用它的方式和调用ActivityManagerService是一样的,通过IBinder。它的初始化入口为PackageManagerService.main:

view plaincopy to clipboardprint?
  1. public static final IPackageManager main(Context context, boolean factoryTest) {  
  2.     PackageManagerService m = new PackageManagerService(context, factoryTest);  
  3.     ServiceManager.addService("package", m);  
  4.     return m;  
  5. }  

       main方法主要是创建一个PackageManagerService,然后注册到ServiceManager中,名称为"package”。PackageManagerService的构造函数中,会去查找系统目录和应用目录下的apk文件,以获取应用的包相关的信息;比如:包名称,包含的Acvity、Provider等。

view plaincopy to clipboardprint?
  1. // ……   
  2. scanDirLI(mSystemAppDir, PackageParser.PARSE_IS_SYSTEM, scanMode);  
  3. // ……   
  4. scanDirLI(mAppInstallDir, 0, scanMode);  
  5. // ……  

       scanDirLI函数中,对于每个package,使用函数scanPackageLI解析其中的信息(此处应该是读取AndroidManifest.xml)。scanPackageLI检查相关信息后,又会调用另一个scanPackageLI。这个函数内部会扫描到手机内所有的Provider信息:

view plaincopy to clipboardprint?
  1. PackageParser.Provider p = pkg.providers.get(i);  
  2. p.info.processName = fixProcessName(pkg.applicationInfo.processName,  
  3.         p.info.processName, pkg.applicationInfo.uid);  
  4. mProvidersByComponent.put(new ComponentName(p.info.packageName,  
  5.         p.info.name), p);  

       mProvidersByComponent保存了所有的provider信息,这部分数据源自于manifest。每个数据包含了PackageParser.Provider、包名称和Provider的类名。

       到这里,我们可以看到,PackageManagerService真的是用来管理手机的应用包的。通过它可以知道所有的系统可用资源。当然这些资源只是一些静态信息。通过这些信息,可以创建应用进程、初始化相关的Android组件。

本文导航

相关阅读 android studio如何导入项目 android studio导入项目教程android studio怎么删除项目 android studio删除项目方法android studio怎么生成apk android studio打包apk教程android studio如何导入jar包 android studio导入jar包教程android studio快捷键如何设置 android studio快捷键设置方法android studio快捷键大全 android studio有哪些快捷键android8.1新特性有哪些 android8.1新特性介绍android8.0和ios11哪个好 android8.0和ios11功能对比评测

文章评论
发表评论

热门文章 Aegisub教程及特效代码动态磁盘无效怎么办 动网易uu加速器怎么样?网汉王pdf ocr怎么用?pd

最新文章 海豚蓝牙ASIO软件怎么Textify使用教程:复制 WinHex查找下载器真实下载链接方法Aegisub教程及特效代码应用adsafe净网大师怎么设置开机启动TrueCrypt使用方法及详细教程

人气排行 千月蓝牙驱动怎么用?千月驱动程序安装教程及手机搬家功能怎么用 iTools手机搬家使用教程蛤蟆吃联机详细图文教程汉王pdf ocr怎么用?pdf转txt图文教程Aegisub教程及特效代码应用“无法通过windows installer服务安装此安装网易uu加速器怎么样?网易uu网游加速器使用图UltraEdit-32自动换行设置方法