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

用android的content provider实例源码

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

2 页 应用进程的初始化

  • 应用进程的初始化
       先看一下ActivityThread.main的实现,它创建了一个ActivityThread对象,初始化之后,进入消息循环。

view plaincopy to clipboardprint?
  1. public static final void main(String[] args) {  
  2.     // ......   
  3.     ActivityThread thread = new ActivityThread();  
  4.     thread.attach(false);  
  5.   
  6.     Looper.loop();  
  7.   
  8.     // ......   
  9. }  

       attach函数中,回去调用ActivityManagerService.attachApplication方法。

view plaincopy to clipboardprint?
  1. mgr.attachApplication(mAppThread);  

       此时,会进入ActivityManagerService的进程空间,进入方法attachApplicationLocked,它会去获取和当前客户端应用程序关联的Provider信息。

view plaincopy to clipboardprint?
  1. List providers = generateApplicationProvidersLocked(app);  

       根据上面的信息,很容易知道此处是通过PackageManagerService获取Provider信息的。参数app表明,只是取运行在该app内的Provider。根据Android的文档,content provider必须在对应的AndroidManifest.xml中定义。默认情况下,是运行在安装包名称命名的进程里面。你也可以在android:process属性中制定所属的进程名称。另一个重要的属性android:multiprocess则可以指定provider的初始化方式,是分散在调用端进程中,从而避免进程间通信;还是只初始化在某个进程内,各个调用端只保留provider的代理。

       随后,通过下面的方法调用,返回到应用程序的进程空间,参数中包含了上面获得的providers。此处的thread实际上就是应用端的ApplicationThread对象。

view plaincopy to clipboardprint?
  1. thread.bindApplication(processName, app.instrumentationInfo != null  
  2.         ? app.instrumentationInfo : app.info, providers,  
  3.         app.instrumentationClass, app.instrumentationProfileFile,  
  4.         app.instrumentationArguments, app.instrumentationWatcher, testMode,   
  5.         isRestrictedBackupMode, mConfiguration, getCommonServicesLocked());  

       ApplicationThread.bindApplication会发送BIND_APPLICATION消息给主线程。主线程会调用ActivityThread.handleBindApplication方法。这个函数里面主要分两步:一是根据需要创建Application、ApplicationContext和ApplicationContentResolver对象。因为,有可能多个apk运行在一个进程中,那么它们内部的组件(Component)执行的上下文(context)是不一样的。这几个对象实际上就是provider执行的上下文。二是根据传递过来的provider信息,创建provider实例,并保存在ActivityThread.mProviderMap中。具体的实例化provider过程如下(下面的代码位于ActivityThread.handleBindApplication中):

view plaincopy to clipboardprint?
  1. List<ProviderInfo> providers = data.providers;  
  2. if (providers != null) {  
  3.     installContentProviders(app, providers);  
  4. }  

       获取ActivityManagerService传递过来的provider信息,并在本进程中初始化。具体的,installContentProviders方法中,会对每个provider调用installProvider方法:

view plaincopy to clipboardprint?
  1. IContentProvider cp = installProvider(context, null, cpi, false);  

       installProvider方法中,主要是实例化Provider,并保存到mProviderMap中:

view plaincopy to clipboardprint?
  1. final java.lang.ClassLoader cl = c.getClassLoader();  
  2. localProvider = (ContentProvider)cl.  
  3.     loadClass(info.name).newInstance();  
  4. provider = localProvider.getIContentProvider();  
  5. // ......   
  6. // Cache the pointer for the remote provider.   
  7. String names[] = PATTERN_SEMICOLON.split(info.authority);  
  8. for (int i=0; i<names.length; i++) {  
  9.     ProviderRecord pr = new ProviderRecord(names[i], provider,  
  10.             localProvider);  
  11.     try {  
  12.         provider.asBinder().linkToDeath(pr, 0);  
  13.         mProviderMap.put(names[i], pr);  
  14.     } catch (RemoteException e) {  
  15.         return null;  
  16.     }  
  17. }  
       上面的installContentProviders方法执行完成之后,会调用ActivityManagerService.publishContentProviders方法,将provider注册到ActivityManagerService中,方便其它应用进程获取。这里面有两个参数,一个是ApplicationThread对象,另一个是provider实例信息。

view plaincopy to clipboardprint?
  1. try {  
  2.     ActivityManagerNative.getDefault().publishContentProviders(  
  3.         getApplicationThread(), results);  
  4. catch (RemoteException ex) {  
  5. }  

       ActivityManagerService.publishContentProviders的实现也很简单,主要是将provider信息保存到ActivityManagerService.mProvidersByName中。具体参见源码。
  • 总结
       本文主要介绍了Android系统内provider的初始化,Android系统默认是会初始化一些provider的,比如:ContactsProvider。它们的初始化和本文介绍的流程应该差不多,主要是在应用进程初始化时获取provider的信息,然后实例化provider,最后将实例化的provider保存到ActivityManagerService中,供其它应用进程使用。需要说明的一点是,应用进程内可以运行多个apk中的组件。
本文导航

相关阅读 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自动换行设置方法