android28 startActivity启动流程分析(二)--ActivityStarter对象的获取和execute()

ActivityManagerService:startActivityAsUser()-->ActivityStarter:execute()

在startActivityAsUser()方法中,先获取ActivityStarter实例,然后通过一系列的setXX()方法,对其中的mRequest对象的多个参数进行赋值,最后执行ActivityStarter的execute()方法。

public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
            Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
            int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,
            boolean validateIncomingUser) {
......
//获取ActivityStarter实例,执行execute方法
 return mActivityStartController.obtainStarter(intent, "startActivityAsUser")
                .setCaller(caller)//通过一系列setXX方法传递参数给ActivityStarter的mRequest对象
                .setCallingPackage(callingPackage)
                .setResolvedType(resolvedType)
                .setResultTo(resultTo)
                .setResultWho(resultWho)
                .setRequestCode(requestCode)
                .setStartFlags(startFlags)
                .setProfilerInfo(profilerInfo)
                .setActivityOptions(bOptions)
                .setMayWait(userId)
                .execute();//最后执行ActivityStarter的execute()
}

这里关于ActivityStarter对象的获取,稍微展开一下,总的来说是通过工厂模式+对象池的复用

mActivityStartController.obtainStarter()调用工厂来获取ActivityStarter对象

 ActivityStarter obtainStarter(Intent intent, String reason) {
        //ActivityStarter:DefaultFactory静态内部类对象
        return mFactory.obtain().setIntent(intent).setReason(reason);
    }

这里的mFactoty对象是ActivityStarter的静态内部类DefaultFacory的实例,这个类定义了ActivityStarter的最大实例数和复用的对象池。

static class DefaultFactory implements Factory {
   private final int MAX_STARTER_COUNT = 3;
   ......
   private SynchronizedPool mStarterPool =
                new SynchronizedPool<>(MAX_STARTER_COUNT);
   ......

  @Override
   public ActivityStarter obtain() {
       ActivityStarter starter = mStarterPool.acquire();

            if (starter == null) {
                starter = new ActivityStarter(mController, mService, mSupervisor, 
                mInterceptor);
            }

            return starter;     
    }

   @Override
        public void recycle(ActivityStarter starter) {
            //重置mRequest对象
            starter.reset(true /* clearRequest*/);
            mStarterPool.release(starter);
        }
}

这里可以看到,ActivityStarter的实例数最多不超过三个,是从对象池中获取的,并且每个放入池中的ActivityStarter对象都要进行reset重置清空操作。

在获取到ActivityStarter对象之后,再通过一系列的setXX方法,对mRequest的参数进行重新赋值,最后执行ActivityStarter:execute()方法。

 

你可能感兴趣的:(android28 startActivity启动流程分析(二)--ActivityStarter对象的获取和execute())