浅析调用Android的content provider(3)

IContentProvider cp = installProvider(context, null, cpi, false);  

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

final java.lang.ClassLoader cl = c.getClassLoader();   localProvider = (ContentProvider)cl.       loadClass(info.name).newInstance();   provider = localProvider.getIContentProvider();   // ......    // Cache the pointer for the remote provider.    String names[] = PATTERN_SEMICOLON.split(info.authority);   for (int i=0; i<names.length; i++) {       ProviderRecord pr = new ProviderRecord(names[i], provider,               localProvider);       try {           provider.asBinder().linkToDeath(pr, 0);           mProviderMap.put(names[i], pr);       } catch (RemoteException e) {           return null;       }   }  

       上面的installContentProviders方法执行完成之后,会调用ActivityManagerService.publishContentProviders方法,将provider注册到ActivityManagerService中,方便其它应用进程获取。这里面有两个参数,一个是ApplicationThread对象,另一个是provider实例信息。

try {       ActivityManagerNative.getDefault().publishContentProviders(           getApplicationThread(), results);   catch (RemoteException ex) {   }  

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

下一篇文章会介绍调用provider的流程()。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwzwsj.html