当前位置: 首页 > 后端技术 > Java

Android中Activity的工作过程(二)

时间:2023-04-01 20:44:45 Java

PS:本文为转载文章,原文可读性会更好,文末有原文链接本文为基于Android中Activity的工作流程(一)继续写是的,Android中Activity的工作流程(一)在这篇文章中,我们提到了两行代码,分别是下面的代码;这里的this指的是MainActivity对象,我们在Android中Activity的工作流程(一)本文分析了MainActivity的onPause的调用过程。本文拟从以上两行代码分析Main2Activity的onCreate和onStart的调用过程。Android中Activity的工作过程(一)在本文中,我们分析了以下几行代码;见注释15,调用ActivityStack的resumeTopActivityInner-Locked(ActivityRecordprev,ActivityOptionsoptions)方法;见注释27和28代码,mStackSupervisor是ActivityStackSupervisor类型的对象,都调用了ActivityStackSupervisor的startSpecificActivityLocked(ActivityR-ecordr,booleanandResume,booleancheckConfig)方法;上面两行代码:Intentintent=newIntent(this,Main2Activity.class);启动活动(意图);我们要启动的是Main2Activity吧?然后ActivityStackSupervisor的startSpecificActivityLocked(ActivityRecordr,booleanandResume,booleancheckConfig)方法是Main2Activity的onCreate和onSt-art方法的入口。好吧,我们回到注解27和28的代码,我们调用的是注解27的代码还是注解?28的密码呢?我们看一下Note26代码中if语句的用途,意思是判断是否创建了新的app进程;首先,我写这个demo的时候并没有启动新的进程来启动Main2Activity,所以我不会按照注释26中if包裹的代码,会执行注释28中的代码。ecordr,booleanandResume,booleancheckConfig)ActivityStackSupervisor方法;见注解29,调用ActivityStackSupervisor的realStartActivi-tyLocked(ActivityR-ecordr,booleanandResume,booleancheckConfig)方法ecordr,ProcessRecordapp,booleanandResume,booleancheckConfig)方法;见注30,app.thread是ActivityThread的内部类ApplicationThread,然后调用ApplicationThread的schedule-LaunchActivity(Intentintent,IBindertoken,intident,ActivityInfoinfo,ConfigurationcurConfig,ConfigurationoverrideConfig,Co-mpatibilityInfocompatInfo,Stringreferrer,IVoiceInteractorvoiceInteractor,intprocState,Bundlestate,PersistableBundlepersistentState,ListpendingResults,ListpendingNewIntents,booleannotResumed,booleanisForward,ProfilerInfoprofilerInfo)方法;见注释31,插入一条等于什么的消息H.LAUNCH_ACTIVITY,然后ActivityThread的内部类H会做相应的处理;见注释32,调用ActivityThread的handleLaunchActivity(ActivityClientRecordr,IntentcustomIntent,Stringreason)方法;见注释33,这里调用了ActivityThread的performLaunch-Activity(ActivityClientRecordr,IntentcustomIntent)方法;私有活动performLaunchActivity(ActivityClientRecordr,IntentcustomIntent){......try{......if(activity!=null){......if(r.isPersistable()){//35,mInstrumentation.callActivityOnCreate(activity,r.state,r.persistentState);}else{//36,mInstrumentation.callActivityOnCreate(activity,r.state);}......if(!r.activity.mFinished){//37,活动。执行开始();r.stopped=false;}...}...}catch(SuperNotCalledExceptione){...}catch(Exceptione){...}返回活动;}见注释35,其中r.isPersistable()为true,所以执行注释35处的代码,mInstrumentation是Instrumentation类型的对象,所以调用ActivityOnCreate(Activityactivity,Bundleicicle,PersistableBundlepersistentState)方法;见注释38,这里调用了Activity的performCreate(Bundleicicle,PersistableBundlepersistentState)方法,我们往下看;见注释39,这里调用了Activity的onCreate(@NullableBundlesavedInstanceState,@NullableBundlesavedInstanceState,@NullablePersistableBundlepersistentState)方法;有没有看到评论40,这里调用了Activity的onCreate(BundlesavedInstanceState)方法,所以把Activity的onCreate过程搞清楚了;好了,我们现在看到评论37的代码,这里调用了Activity的performStart方法之后,我们往下看;看注释41,mInstrumentation是一个Instrumentation类型的对象,这里调用Instrumentation的callActivityOnStart(Activityactivity)方法;看到注释42中没有代码,这里调用了Activity的onStart方法,所以Activity的onStart流程也一清二楚了