Android-AMS】startActivity分析(之二)

重要函数调用关系

按函数的嵌套调用关系化简Activty启动流程:

【预备部分】:从某个Activty通过调用startActivity来启动另外一个Activity开始

当一个Activity想启动另一个Activity时,最常见的方式是:

context.startActivity

 context.startActivity的实现是在ContextImpl.java中,但这只是一层封装,其最终会调用AMS的startActivity,而真正的启动过程是从AMS开始的。

ContextImpl.java::startActivity

  Instrumentation.java::execStartActivity

    ActivityManagerService.java::startActivity

要点:

  • ContextImpl通过mMainThread找到一个桥梁实例Instrumentation(负责APP组件的创建和AMS与APP的之间的通信)
  • Instrumentation通过ActivityManager打到AMS
  • 调用AMS的startActivity函数

【Activity启动前半部分】:从请求启动Activity到请求启动应用进程


ActivityManagerService.java::startActivity(){
  ActivityStarter.java::startActivityMayWait(){
    ActivityStarter.java::startActivityLocked(){
      ActivityStarter.java::startActivity(){
        ActivityStarter.java::startActivityUnchecked(){
          //P51:启动一个Activity
          ActivityStack.java::startActivityLocked()
          //P52:唤醒栈顶Activity
          ActivityStackSupervisor.java::resumeFocusedStackTopActivityLocked(){
            ActivityStack.java::resumeTopActivityUncheckedLocked(){
              ActivityStack.java::resumeTopActivityInnerLocked(){
                StackSupervisor.java::startSpecificActivityLocked(){
                   //91:如果app!=null
                   realStartActivityLocked()
                   //92:否则:启动一个应用
                   ActivityManagerService.java::startProcessLocked(){
                     //通知Zygote派生一个子进程
                     Process::start()
          }}}}}
        }
}}}}

 要点:

  • 以AMS的startActivity为入口
  • ActivityStarter中作启动参数合法性、权限检测等
  • 新建ActivityRecord/TaskRecord,并找到合适的ActivityStack放到其栈顶
  • 尝试唤醒栈顶Activity
  • 如果没有相应的应用进程,则启动进程(又回到了AMS)

【Activity启动后半部分】: 从应用进程的创建到Activity启动

ActivityManagerService.java::starttProcessLocked(){
  //发信号给Zygote创建一个新进程,注意参数:启动后将调用ActivityThread.main
  Process.start("android.app.ActivityThread",...)(){
    ActivityThread.java::main(){
      //开始附着应用到进程
      ActivityThread.java::attach(false){
        RuntimeInit.setApplicationObject(mAppThread.asBinder())
        ActivityManagmentService.java::attachApplication(){
          //P5.1:绑定Application
          ActivityThread.java::ApplicationThread.bindApplication(){
            sendMessage(H.BIND_APPLICATION, data) //发信号导致下面的函数被调用
             ActivityThread.java::handleBindApplication(){
              Process.setArgV0(data.processName);//设置进程名称
             }
          //P5.2:附着Application
          ActivityStackSupervisor.java::attachApplicationLocked(){
            //P6.1真正启动Activity
            ActivityStackSupervisor.java::realStartActivityLocked(){
              ActivityThread.java::ApplicationThread.scheduleLaunchActivity(){
                sendMessage(H.LAUNCH_ACTIVITY, r) //发信号导致下面的函数被调用
                  ActivityThread.java::handleLaunchActivity(){
                   ActivityThread.java::performLaunchActivity(){
                      Instrumentation.java::newActivity(){
                        //真正导入Activity的class
                        ClassLoader.java::loadClass().newInstance()
                      }
                      Instrumentation.java::callActivityOnCreate(){
                        Activity.java::performCreate(){
                          //调用Activity子类的onCreate, 
                          //也就是应用开发时Activity中重载的那个onCreate()
                          Activity.java::onCreate()
                   }}}}
                   ActivityThread.java::handleResumeActivity(){
                     ActivityThread.java::performResumeActivity(){
                       Activity.java::performResume(){
                         Instrumentation.java::callActivityOnResume(){
                         //调用Activity子类的onResume,
                         //也就是应用开发时Activity中重载的那个onResume()
                           Activity.java::onResume
                   }}}}
          }}}
          //P5.3:附着ActiveService
          ActiveServices.java::attachApplicationLocked
          //P5.4:更新OomAdj
          ActivityManagmentService.java::updateOomAdjLocked
}}}}}

要点:

  • 以AMS的starttProcessLocked为入口
  • 发信号给Zygote创建新进程
  • 新进程的入口函数是ActivityThread.main
  • 通过ActivityThread将新进程和APK绑定(ActivityThread根据app的参数初始化Instrumentation等变量)
  • 将新进程附着到ActivityStackSupervisor(可理解为与某个ActivityStack关联)
  • 启动获得焦点的ActivityStack的栈顶Activity,onCreate()/onResume()函数将被调用
  • 附着APK中的服务
  • 更新OomAdj
发布了90 篇原创文章 · 获赞 24 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/menghaocheng/article/details/104115408