瑞鲁手机APP下载网_专注推荐好用的手机APP和游戏APP

studio导入项目教程 android

用android的content provider实例源码

人气:0引自:手机APP下载网

作为一款被广泛使用的开发语言,php源码的安全性令人堪忧,最近php官方就在一则公告里表明有人曾经成功侵入到php官方服务器内,并且成功渗透到php源码的修改权限,尽管经过排查表明入侵者并没有植入后门,但是已经表明了php源码存在风险的可能。

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

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

概述       总的来说此问题分为两个步骤: 初始化content provider。这一阶段主要是参照AndroidManifest.xml,初始化content provider。注意这里只有当包含content provider的进程运行的时候,才会对该进程内所有的content provider进行初始化。其它provider是按需初始化的(后续文章会介绍该问题)。   调用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?public static final IPackageManager main(Context context, boolean factoryTest) {      PackageManagerService m = new PackageManagerService(context, factoryTest);      ServiceManager.addService("package", m);      return m;  }   public static final IPackageManager main(Context context, boolean factoryTest) { PackageManagerService m = new PackageManagerService(context, factoryTest); ServiceManager.addService("package", m); return m; }       main方法主要是创建一个PackageManagerService,然后注册到ServiceManager中,名称为"package”。PackageManagerService的构造函数中,会去查找系统目录和应用目录下的apk文件,以获取应用的包相关的信息;比如:包名称,包含的Acvity、Provider等。view plaincopy to clipboardprint?// ……   scanDirLI(mSystemAppDir, PackageParser.PARSE_IS_SYSTEM, scanMode);  // ……   scanDirLI(mAppInstallDir, 0, scanMode);  // ……   // …… scanDirLI(mSystemAppDir, PackageParser.PARSE_IS_SYSTEM, scanMode); // …… scanDirLI(mAppInstallDir, 0, scanMode); // ……       scanDirLI函数中,对于每个package,使用函数scanPackageLI解析其中的信息(此处应该是读取AndroidManifest.xml)。scanPackageLI检查相关信息后,又会调用另一个scanPackageLI。这个函数内部会扫描到手机内所有的Provider信息:view plaincopy to clipboardprint?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);   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组件。

12下一页 本文导航 第1页: 首页 第2页: 应用进程的初始化

专题文集:其它软件 android
引用标题:《studio导入项目教程 android》
来源地址:https://www.sdruilu.cn/index.php/news/tpart-52352.html