PS:本文为转载文章,原文可读性会更好,文末有原文链接PS:这篇文章基于AndroidApi26来分析源码。活动是四大组成部分之一。当然,其内部工作流程体系也做了很多封装。这种封装使得启动Activity变得极其简单。在显式调用的情况下,假设我使用MainActivity来启动Main2Activity,那么可以使用下面的代码来完成;为了更好的理解Activity启动时两个Activity的生命周期的方法调用过程,我们先列出MainActivity和Main2Activity的代码;(1)MainActivity代码;(2)Main2Activity代码;运行app,打印log如下;看,跳转时两个activity的声明周期方法的调用顺序是:MainActivity.onPause->Main2Activity.onCreate->Main2Activity.onStart->Main2Activity.onResume->MainActivity.onStop。由于上面提到的5个生命周期的过程涉及到很多源码,这里我们先来寻找一下MainActivity的onPause方法的流向。当MainActivity启动Main2Activity时,它内部是如何进行的呢?我们看一下Activity的startActivity(Intentintent)方法的实现;startActivity(Intentintent)方法调用Activity的startActivity(Intentintent,@NullableBundleoptions)方法;由于options参数为空,执行的是注2代码块,我们看一下Activity的startActivityForResult(@RequiresPermissionIntentintent,intrequestCode)方法;可空捆绑选项)方法;看,为什么会执行Note3中的代码?这里首先要判断mParent==null是否为真,mParent是当前Activity的父Activity,而我们的Activity是MainActivity,没有父Activity,所以这里mParent==null的结果为真,其实,mParent常用于ActivityGroup,ActivityGroup从API14开始弃用。我们看一下注释4中的代码,mInstrumentation是一个Instrumentation类型的对象。我们看Instrumentation的execStartActivity(Contextwho,IBindercontextThread,IBindertoken,Activitytarget,Intentintent,intrequestCode,Bundleoptions)方法;我们先来看Note6。代码,看方法名,好像是检查Activity启动的结果,好吧,我们看一下Instrumentation的checkStartActivityResult(intres,Objectintent)方法;各种检查的结果很多,我省略了很多;见注释7,如果我们没有在AndroidManifest.xml文件中注册Activity,那么UnabletofindexplicitactivityclasshaveyoudeclaredthisactivityinyourAndroidManifest.xml?将抛出异常。好了,我们再回头看一下注释5中的代码,ActivityManager.getService()其实是获取ActivityManagerService的,所以我们再往下看ActivityManagerService的startActivity(IApplicationThreadcaller,StringcallingPackage,Intentintent,StringresolvedType,IBinderresultTo,StringresultWho,intrequestCode,intstartFlags,ProfilerInfoprofilerInfo,BundlebOptions)方法;ActivityManagerService的startActivity(IApplicationThreadcaller,StringcallingPackage,Intentintent,StringresolvedType,IBinderresultTo,StringresultWho,intrequestCode,intOfoundlestartFlags,Profiler)方法又调用了ActivityManagerService的startActivityAsUser方法;mActivityStarter是一个ActivityStarter实例对User的启动对象(ActivityManagersService的startApplicationAsUser,ActivityManagersServicecaller,StringcallingPackage,Intentintent,StringresolvedType,IBinderresultTo,StringresultWho,intrequestCode,intstartFlags,ProfilerInfoprofilerInfo,BundlebOptions,intuserId)方法调用ActivityStarter的startActivityMayWait(IApplicationThreadcaller,intcallingUid,StringcallingPackage,Intentintent,StringresolvedType,IVoiceInteractionSe-ssionvoiceSession,IVoiceInteractorvoiceInteractor,IBinderresultTo,StringresultWho,intrequestCode,intstartFlags,ProfilerInfoprofilerInfo,WaitResultoutResult,ConfigurationglobalConfig,BundlebOptions,booleanignoreTargetSecurity,intuserId,IActivityContaineriContainer,TaskRecordinTask,Stringreason)方法;finalintstartActivityMayWait(IApplicationThreadcaller,intcallingUid,StringcallingPackage,Intentintent,StringresolvedType,IVoiceInteractionSessionvoiceSession,IVoiceInteractorvoiceInteractor,IBinderresultTo,StringresultWho,intrequestCode,intstartFlags,ProfilerInfoprofilerInfo,WaitResultoutResult,配置globalConfig,BundlebOptions,booleanignoreTargetSecurity,intuserId,IActivityContaineriContainer,TaskRecordinTask,Stringreason){......synchronized(mService){......//9、intres=startActivityLocked(caller,intent,ephemeralIntent,resolvedType,aInfo,rInfo,voiceSession,voiceInteractor,resultTo,resultWho,requestCode,callingPid,callingUid,callingPackage,realCallingPid,realCallingUid,startFlags,options,ignoreTargetSecurity,componentSpecified,outRecord,container,inTask,reason);......返回资源;}}看注释9的代码,又调了ActivityStarter的startActivityLocked(IApplicationThreadcaller,Intentintent,IntentephemeralIntent,StringresolvedType,ActivityInfoaInfo,ResolveInforInfo,IVoiceInteractionSessionvoiceSession,IVoi-ceInteractorvoiceInteractor,IBinderresultTo,StringresultWho,intrequestCode,intcallingPid,intcallingUid,StringcallingPackage,intrealCallingPid,intrealCallingUid,intstartFlags,ActivityOptionsoptions,booleanignoreTargetSecurity,booleancomponentSpecified,Activity-Record[]outActivity,ActivityStackSupervisor.ActivityContainer包含-er,TaskRecordinTask,Stringreason)方法;看注解10的代码,又调了ActivityStarter的startActivity(IApplicationThreadcaller,Intentintent,IntentephemeralIntent,StringresolvedType,ActivityInfoaInfo,ResolveInforInfo,IVoiceInteractionSessionvoiceSession,IVoiceInteractorvoiceIn-teractor,IBinderresultTo,StringresultWho,intrequestCode,intcallingPid,intcallingUid,StringcallingPackage,intrealCallingPid,intrealCallingUid,intstartFlags,ActivityOptionsoptions,booleanignoreTargetSecurity,booleancomponentSpecified,ActivityRecord[]outActivity,ActivityStackSupervisor.ActivityContainercontainer,Ta-skRecordinTask)方法;看注释11,调了ActivityStarter的startActivity(finalActivityRecordr,ActivityRecordsourceRecord,IVoiceInteractionSessionvoiceSession,IVoiceInteractorvoiceInteractor,intstartFlags,booleandoResume,ActivityOptionsoptions,TaskRecordinTask,ActivityRecord[]outActivity)方1法;看法;,调到了ActivityStarter的startActivityUnchecked(finalActivityRecordr,ActivityRecordsourceRecord,IVoiceInteractionSessionvoiceSession,IVoiceInteractorvoiceInteractor,intstartFlags,booleandoResume,ActivityOptionsoptions,TaskRecordinTask,ActivityRec-ord[]outActivity)方法;//注意:这个方法应该只从{@linkstartActivity}调用。privateintstartActivityUnchecked(finalActivityRecordr,ActivityRecordsourceRecord,IVoiceInteractionSessionvoiceSession,IVoiceInteractorvoiceInteractor,intstartFlags,booleandoResume,ActivityOptions选项,TaskRecordinTask,ActivityRecord[]outActivity){......if(mDoResume){finalActivityRecordtopTaskActivity=mStartActivity.getTask().topRunningActivityLocked();if(!mTargetStack.isFocusable()||(topTaskActivity!=null&&topTaskActivity.mTaskOverlay&&mStartActivity!=topTaskActivity)){......}else{......//13、mSupervisor.resumeFocusedStackTopActivityLocked(mTargetStack、mStartActivity、mOptions);}}else{...}......返回START_SUCCESS;}看注释13中的代码,因为我的Main2Activity的启动模式是标准的,所以就转到这里,mSupervisor是ActivityStackSupervisor类型的一个实例,我们看一下resumeFocusedStackTopActivityLock-ed(ActivityStackSupervisor的ActivityStacktargetStack,ActivityRecordtarget,活动选项离子目标选项)方法;见注释14,调用ActivityStack的resumeTopActivityUncheckedLo-cked(ActivityRecordprev,ActivityOptionsoptions)方法;见注释15,调用ActivityStack的resumeTopActivityInner-Locked(ActivityRecordprev,ActivityOptionsoptions)方法;调用ActivityStack的选项6实现了ActivityStack的startPausingLocked(booleanuserLeaving,booleanuiSleeping,ActivityRecordresuming,booleanpauseImmediately)方法;见注释17,prev.app.thread是ActivityThread的内部类ApplicatitonThread,调用了schedulePauseActivity(user,IBinderanishtoken,intconfigChanges,booleandontReport)方法;见注18,因为finished为false,所以第一个参数都是H.PAUSE_ACTIVITY,调用ActivityThread的内部类H;见注释19,调用handlePauseActivity(IBindertoken,booleanfinished,booleanuserLeaving,intconfigChanges,booleandontReport,intseq)方法;见注释20,调用ActivityThread的performPauseActivity(IBindertoken,booleanfinished,booleansaveState,Stringreason)方法;见注释21,调用ActivityThreadperformPauseActivity(Activit-yClientRecordr,booleanfinished,booleansaveState,Stringreason)方法;参见注释22,调用ActivityThread的performPauseActivity-IfNeeded(ActivityClientRecordr,Stringreason)方法;见注释23,mInstrumentation是Instrumentation类型的对象,所以调用了Instrumentation的callActivityOnPause(Activityactivity)方法;见注释24,调用了Activity的performPause方法;看注释25,Activity的onPause方法已经找到了,我们的目标已经完成,那么本文到此结束写完
