Android应用程序组件Content Provider的启动过程源代码分析(7)
16lz
2021-01-24
函数installProvider执行完成以后,返回到Step 16中的instalContentProviders函数中,执行下面语句:
Step 21. ActivityMangerService.publishContentProviders 这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:
- try{
- ActivityManagerNative.getDefault().publishContentProviders(
- getApplicationThread(),results);
- }catch(RemoteExceptionex){
- }
Step 21. ActivityMangerService.publishContentProviders 这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:
在我们这个情景中,只有一个Content Provider,因此,这里的N等待1。在中间的for循环里面,最重要的是下面这个语句:
- publicfinalclassActivityManagerServiceextendsActivityManagerNative
- implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{
- ......
- publicfinalvoidpublishContentProviders(IApplicationThreadcaller,
- List<ContentProviderHolder>providers){
- ......
- synchronized(this){
- finalProcessRecordr=getRecordForAppLocked(caller);
- ......
- finalintN=providers.size();
- for(inti=0;i<N;i++){
- ContentProviderHoldersrc=providers.get(i);
- if(src==null||src.info==null||src.provider==null){
- continue;
- }
- ContentProviderRecorddst=r.pubProviders.get(src.info.name);
- if(dst!=null){
- mProvidersByClass.put(dst.info.name,dst);
- Stringnames[]=dst.info.authority.split(";");
- for(intj=0;j<names.length;j++){
- mProvidersByName.put(names[j],dst);
- }
- intNL=mLaunchingProviders.size();
- intj;
- for(j=0;j<NL;j++){
- if(mLaunchingProviders.get(j)==dst){
- mLaunchingProviders.remove(j);
- j--;
- NL--;
- }
- }
- synchronized(dst){
- dst.provider=src.provider;
- dst.app=r;
- dst.notifyAll();
- }
- ......
- }
- }
- }
- }
- ......
- }
- ContentProviderRecorddst=r.pubProviders.get(src.info.name);
- mProvidersByClass.put(dst.info.name,dst);
- Stringnames[]=dst.info.authority.split(";");
- for(intj=0;j<names.length;j++){
- mProvidersByName.put(names[j],dst);
- }
- intNL=mLaunchingProviders.size();
- intj;
- for(j=0;j<NL;j++){
- if(mLaunchingProviders.get(j)==dst){
- mLaunchingProviders.remove(j);
- j--;
- NL--;
- }
- }
- synchronized(dst){
- dst.provider=src.provider;
- dst.app=r;
- dst.notifyAll();
- }
- IContentProviderprov=installProvider(context,holder.provider,
- holder.info,true);
- publicfinalclassActivityThread{
- ......
- privatefinalIContentProviderinstallProvider(Contextcontext,
- IContentProviderprovider,ProviderInfoinfo,booleannoisy){
- ......
- if(provider==null){
- ......
- }elseif(localLOGV){
- ......
- }
- synchronized(mProviderMap){
- //Cachethepointerfortheremoteprovider.
- Stringnames[]=PATTERN_SEMICOLON.split(info.authority);
- for(inti=0;i<names.length;i++){
- ProviderClientRecordpr=newProviderClientRecord(names[i],provider,
- localProvider);
- try{
- provider.asBinder().linkToDeath(pr,0);
- mProviderMap.put(names[i],pr);
- }catch(RemoteExceptione){
- returnnull;
- }
- }
- ......
- }
- returnprovider;
- }
- ......
- }
更多相关文章
- android adapter的性能小结
- [Android]加载外部.9图片
- 修改android 开机之后的默认语言成中文
- Android通过反射实现强制停止应用程序的方法
- Android加载网络图片
- Android(安卓)app启动流程(Activity启动过程)【基于API26】
- Android(安卓)bluetooth介绍(四): a2dp connect流程分析
- Android数据库编程:SqLiteOpenHelper的使用