在Android下,查询联系人、通话记录等,需要用到content provider。但是,调用content provider时,Android框架内部是如何做的呢?
下面调用所采用的开发环境及源码都是基于Android 1.6版本。
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也是一个服务,是用来管理手机内所有的apk包的。调用它的方式和调用ActivityManagerService是一样的,通过IBinder。它的初始化入口为PackageManagerService.main:
public static final IPackageManager main(Context context, boolean factoryTest) { PackageManagerService m = new PackageManagerService(context, factoryTest); ServiceManager.addService("package", m); return m; }
// …… scanDirLI(mSystemAppDir, PackageParser.PARSE_IS_SYSTEM, scanMode); // …… scanDirLI(mAppInstallDir, 0, scanMode); // ……
PackageParser.Provider p = pkg.providers.get(i); p.info.processName = fixProcessName(pkg.applicationInfo.processName, p.info.processName, pkg.applicationInfo.uid); mProvidersByComponent.put(new ComponentName(p.info.packageName, 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自动换行设置方法
查看所有0条评论>>