启动activity的过程追踪

0、启动activity最终还是调用startActivityForResult()方法

Activity#startActivityForResult{

  1. //这里会启动新的Activity,核心功能都在mMainThread.getApplicationThread()中完成  
  2.   Instrumentation.ActivityResult ar = 
  3. mInstrumentation.execStartActivity(
  4. this, mMainThread.getApplicationThread(), mToken, this,intent, requestCode, options);

  5. //发送结果,即onActivityResult会被调用  
  6.    mMainThread.sendActivityResult( mToken, mEmbeddedID, requestCode, ar.getResultCode(),ar.getResultData());
  7.             

}

1、真正打开activity的实现在Instrumentation的execStartActivity方法

Instrumentation#execStartActivity(Context who,IBinder contextThread){

  1. //核心功能在这个whoThread中完成,其内部scheduleLaunchActivity方法用于完成activity的打开  
  2.     IApplicationThread whoThread = (IApplicationThread) contextThread; 

  1. //这里才是真正打开activity的地方,核心功能在whoThread中完成。(相当于调用远程接口IApplicationThread中的scheduleLaunchActivity)  
  2.         int result = ActivityManagerNative.getDefault()  
  3.             .startActivity(whoThread, who.getBasePackageName(), intent,  
  4.                     intent.resolveTypeIfNeeded(who.getContentResolver()),  
  5.                     token, target != null ? target.mEmbeddedID : null,  
  6.                     requestCode, 0nullnull, options);  

}

接下来我们要去看看IApplicationThread,因为核心功能由其内部的scheduleLaunchActivity方法来完成,由于IApplicationThread是个接口,所以,我们需要找到它的实现类,我已经帮大家找到了,它就是ActivityThread中的内部类ApplicationThread,看下它的继承关系:

private class ApplicationThread extends ApplicationThreadNative;

public abstract class ApplicationThreadNative extends Binder implements IApplicationThread;

可以发现,ApplicationThread还是间接实现了IApplicationThread接口,先看下这个类的结构:

启动activity的过程追踪_第1张图片





2、组装activity的记录信息r,并发消息给handler

ApplicationThread#scheduleLaunchActivity{

queueOrSendMessage(H.LAUNCH_ACTIVITY, r);

}

3、处理ApplicationThread中发来的消息

ActivityThread#H extends Handler { 

//根据消息类型处理发来的消息

  1. //这里处理startActivity消息  
  2. handleLaunchActivity(r, null); 

}

4、初始化activity,并调用该周期方法

ActivityThread#handleLaunchActivity(r){ 

Activity a = performLaunchActivity(r, customIntent);  //初始化了activity,并调用了onCreate();

接着调用onResume():

handleResumeActivity(r.token, false, r.isForward,!r.activity.mFinished && !r.startsNotResumed); 


根据判断,来调用onPause();

mInstrumentation.callActivityOnPause(r.activity);// 其中mInstrumentation是来辅助activity启动的对象   

.....

}

5、activity在该方法中真正完成初始化

ActivityThread#performLaunchActivity(ActivityClientRecord r,..){

  1.  //首先从intent中解析出目标activity的启动参数  
  2.     ComponentName component = r.intent.getComponent();  

//根据activity的记录信息,以反射方式,实例化activity
  1. java.lang.ClassLoader cl = r.packageInfo.getClassLoader();  
  2.         //用ClassLoader(类加载器)将目标activity的类通过类名加载进来并调用newInstance来实例化一个对象  
  3.         //其实就是通过Activity的无参构造方法来new一个对象,对象就是在这里new出来的。  
  4.         activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);                 
//调用onCreate()方法

  1. //目标activity的onCreate被调用了,到此为止,Activity被启动了,接下来的流程就是Activity的生命周期了,  
  2.             //本文之前已经提到,其生命周期的各种状态的切换由ApplicationThread内部来完成  
  3.             mInstrumentation.callActivityOnCreate(activity, r.state);

}


你可能感兴趣的:(Android原理)