Android应用程序从Launcher启动流程

Android应用程序从Launcher启动流程如下所示:

先上最最最重要的理解过后的总结图:
这里写图片描述

再上源码跟踪过程:
/*******************************************************
* Launcher通过Binder告诉ActivityManagerService,
* 它将要启动一个新的Activity;
******************************************************/
Launcher.startActivitySafely->
Launcher.startActivity->
//要求在新的Task中启动此Activity
//intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
Activity.startActivity->
Activity.startActivityForResult->
Instrumentation.execStartActivity->
// ActivityManagerNative.getDefault()返回AMS Proxy接口
ActivityManagerNative.getDefault().startActivity->
ActivityManagerProxy.startActivity->

   ActivityManagerService.startActivity-> (AMS)    
   ActivityManagerService.startActivityAsUser->     
    ActivityStack.startActivityMayWait->    
    ActivityStack.resolveActivity(获取ActivityInfo)    
      //aInfo.name为main Activity,如:com.my.test.MainActivity    
      //aInfo.applicationInfo.packageName为包名,如com.my.test    
    ActivityStack.startActivityLocked->    
      //ProcessRecord callerApp; 调用者即Launcher信息    
      //ActivityRecord sourceRecord; Launcher Activity相关信息    
      //ActivityRecord r=new ActivityRecord(...),将要创建的Activity相关信息      
    ActivityStack.startActivityUncheckedLocked->    
     //Activity启动方式:ActivityInfo.LAUNCH_MULTIPLE/LAUNCH_SINGLE_INSTANCE/    
     //             ActivityInfo.LAUNCH_SINGLE_TASK/LAUNCH_SINGLE_TOP)    
     // 创建一个新的task,即TaskRecord,并保存在ActivityRecord.task中    
     //r.setTask(new TaskRecord(mService.mCurTask, r.info, intent), null, true)    
     // 把新创建的Activity放在栈顶       
     ActivityStack.startActivityLocked->    
     ActivityStack.resumeTopActivityLocked->    
     ActivityStack.startPausingLocked (使Launcher进入Paused状态)->      

 /***************************************************************** 
  * AMS通过Binder通知Launcher进入Paused状态 
  ****************************************************************/  
  ApplicationThreadProxy.schedulePauseActivity->     
  //private class ApplicationThread extends ApplicationThreadNative    
  ApplicationThread.schedulePauseActivity->    

   ActivityThread.queueOrSendMessage->    

   // 调用Activity.onUserLeaveHint    
   // 调用Activity.onPause    
   // 通知activity manager我进入了pause状态    
   ActivityThread.handlePauseActivity->    

   /***************************************************************** 
    * Launcher通过Binder告诉AMS,它已经进入Paused状态 
    ****************************************************************/  
   ActivityManagerProxy.activityPaused->    
   ActivityManagerService.activityPaused->    
   ActivityStack.activityPaused->(把Activity状态修改为PAUSED)    
   ActivityStack.completePauseLocked->    

   // 参数为代表Launcher这个Activity的ActivityRecord    
   // 使用栈顶的Activity进入RESUME状态    
   ActivityStack.resumeTopActivityLokced->    
     //topRunningActivityLocked将刚创建的放于栈顶的activity取回来    
     // 即在ActivityStack.startActivityUncheckedLocked中创建的    

   /***************************************************************** 
    * AMS创建一个新的进程,用来启动一个ActivityThread实例, 
    * 即将要启动的Activity就是在这个ActivityThread实例中运行 
    ****************************************************************/  
   ActivityStack.startSpecificActivityLocked->    

    // 创建对应的ProcessRecord    
    ActivityManagerService.startProcessLocked->    

     // 启动一个新的进程    
     // 新的进程会导入android.app.ActivityThread类,并且执行它的main函数,    
     // 即实例化ActivityThread, 每个应用有且仅有一个ActivityThread实例    
     Process.start("android.app.ActivityThread",...)->    

     // 通过zygote机制创建一个新的进程    
     Process.startViaZygote->    

     // 这个函数在进程中创建一个ActivityThread实例,然后调用    
     // 它的attach函数,接着就进入消息循环    
     ActivityThread.main->    

     /***************************************************************** 
      * ActivityThread通过Binder将一个ApplicationThread类的Binder对象 
      * 传递给AMS,以便AMS通过此Binder对象来控制Activity整个生命周期 
      ****************************************************************/  
     ActivityThread.attach->    
     IActivityManager.attachApplication(mAppThread)->    
     ActivityManagerProxy.attachApplication->    
     ActivityManagerService.attachApplication->    

     // 把在ActivityManagerService.startProcessLocked中创建的ProcessRecord取出来    
     ActivityManagerService.attachApplicationLocked->    

     /***************************************************************** 
      * AMS通过Binder通知ActivityThread一切准备OK,它可以真正启动新的Activity了 
      ****************************************************************/              
     // 真正启动Activity    
     ActivityStack.realStartActivityLocked->    
     ApplicationThreadProxy.scheduleLaunchActivity->    
     ApplicationThread.scheduleLaunchActivity->    
     ActivityThread.handleLaunchActivity->    
       // 加载新的Activity类,并执行它的onCreate    
       ActivityThread.performLaunchActivity    
        /*1) Instrumentation.newActivity: 加载新类,即创建Activity对象;  
          2) ActivityClientRecord.packageInfo.makeApplication:创建Application对象;  
             <LoadedApk.makeApplication>  
          3) Activity.attach(Context context, ActivityThread aThread,  
                Instrumentation instr, IBinder token, int ident,  
                Application application, Intent intent, ActivityInfo info,  
                CharSequence title, Activity parent, String id,  
                NonConfigurationInstances lastNonConfigurationInstances,  
                Configuration config):把Application attach到Activity, 即把Activtiy  
                                       相关信息设置到新创建的Activity中  
          4) Instrumentation.callActivityOnCreate:调用onCreate;*/    

       // 使用Activity进入RESUMED状态,并调用onResume    
       ActivityThread.handleResumeActivity   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值