Android的四大组件中除了BroadCastReceiver以外,其他三种组件都必须在AndroidManifest中注册,对于BroadCastReceiver来说,它既可以在AndroidManifest中注册也可以通过代码来注册,在调用方式上,Activity、Service和BroadCastReceiver需要借助Intent,而ContentProvider则无需借助Intent。

Activity是一种展示型组件,用于向用户直接展示一个界面,并且可以接收用户的输入信息从而进行交互,对于用户来说,Activity就是一个Android应用的全部,这是因为其他三大组件对用户来说都是不可感知的。Activity的启动由Intent触发,其中Intent可以分为显式Intent和隐式Intent,显式Intent可以明确地指向一个Activity组件,隐式Intent则指向一个或多个目标Activity组件,当然也有可能没有一个Activity组件处理这个Intent。

Activity的工作过程

要分析Activity的启动过程,就需要从startActivity方法开始分析,startActivity方法有好几种重载方式,但是最终都会调用startActivityForResult方法,具体代码如下:

/***@hide*/@OverridepublicvoidstartActivityForResult(Stringwho,Intentintent,intrequestCode,@NullableBundleoptions){Urireferrer=onProvideReferrer();if(referrer!=null){intent.putExtra(Intent.EXTRA_REFERRER,referrer);}options=transferSpringboardActivityOptions(options);Instrumentation.ActivityResultar=mInstrumentation.execStartActivity(this,mMainThread.getApplicationThread(),mToken,who,intent,requestCode,options);if(ar!=null){mMainThread.sendActivityResult(mToken,who,requestCode,ar.getResultCode(),ar.getResultData());}cancelInputsAndStartExitTransition(options);}

在上面代码中,要注意的是mMainThread.getApplicationThread()这个参数,它的类型是ApplicationThread,ApplicationThread是ActivityThread的一个内部类,其实可以知道的是,ApplicationThread和ActivityThread在Activity启动过程中发挥着重要的作用。然后看下 mInstrumentation.execStartActivity方法,代码如下:

publicActivityResultexecStartActivity(Contextwho,IBindercontextThread,IBindertoken,Activitytarget,Intentintent,intrequestCode,Bundleoptions){IApplicationThreadwhoThread=(IApplicationThread)contextThread;Urireferrer=target!=null?target.onProvideReferrer():null;if(referrer!=null){intent.putExtra(Intent.EXTRA_REFERRER,referrer);}if(mActivityMonitors!=null){synchronized(mSync){finalintN=mActivityMonitors.size();for(inti=0;i<N;i++){finalActivityMonitoram=mActivityMonitors.get(i);if(am.match(who,null,intent)){am.mHits++;if(am.isBlocking()){returnrequestCode>=0?am.getResult():null;}break;}}}}try{intent.migrateExtraStreamToClipData();intent.prepareToLeaveProcess(who);intresult=ActivityManagerNative.getDefault().startActivity(whoThread,who.getBasePackageName(),intent,intent.resolveTypeIfNeeded(who.getContentResolver()),token,target!=null?target.mEmbeddedID:null,requestCode,0,null,options);checkStartActivityResult(result,intent);}catch(RemoteExceptione){thrownewRuntimeException("Failurefromsystem",e);}returnnull;}

从上面代码中可以看出,启动Activity真正的实现由ActivityManagerNative.getDefault()的startActivity方法来完成的,ActivityManagerService(简称AMS)继承自ActivityManagerNative,而ActivityManagerNative继承自Binder并实现了IActivityManager这个Binder接口,因此AMS也是一个Binder,它是IActivityManager的具体实现,其实ActivityManagerNative.getDefault()具体得到是AMS,在ActivityManagerNative中,AMS这个Binder对象采用单例模式对外提供,第一次调用它的get方法时它会通过create方法来初始化AMS这个Binder对象,在后续的调用中则直接返回之前创建的对象。这个过程源码如下:

/***Retrievethesystem'sdefault/globalactivitymanager.*/staticpublicIActivityManagergetDefault(){returngDefault.get();}privatestaticfinalSingleton<IActivityManager>gDefault=newSingleton<IActivityManager>(){protectedIActivityManagercreate(){IBinderb=ServiceManager.getService("activity");if(false){Log.v("ActivityManager","defaultservicebinder="+b);}IActivityManageram=asInterface(b);if(false){Log.v("ActivityManager","defaultservice="+am);}returnam;}};

看到其中的源码,可以得知,Activity的启动过程又转移到AMS中,最终只需要分析AMS中的startActivity方法即可。同时,我们也在execStartActivity方法中看到这么一句:checkStartActivityResult(result, intent),直观应该是启动Activity的结果,具体实现如下:

/**@hide*/publicstaticvoidcheckStartActivityResult(intres,Objectintent){if(res>=ActivityManager.START_SUCCESS){return;}switch(res){caseActivityManager.START_INTENT_NOT_RESOLVED:caseActivityManager.START_CLASS_NOT_FOUND:if(intentinstanceofIntent&&((Intent)intent).getComponent()!=null)thrownewActivityNotFoundException("Unabletofindexplicitactivityclass"+((Intent)intent).getComponent().toShortString()+";haveyoudeclaredthisactivityinyourAndroidManifest.xml?");thrownewActivityNotFoundException("NoActivityfoundtohandle"+intent);caseActivityManager.START_PERMISSION_DENIED:thrownewSecurityException("Notallowedtostartactivity"+intent);caseActivityManager.START_FORWARD_AND_REQUEST_CONFLICT:thrownewAndroidRuntimeException("FORWARD_RESULT_FLAGusedwhilealsorequestingaresult");caseActivityManager.START_NOT_ACTIVITY:thrownewIllegalArgumentException("PendingIntentisnotanactivity");caseActivityManager.START_NOT_VOICE_COMPATIBLE:thrownewSecurityException("Startingundervoicecontrolnotallowedfor:"+intent);caseActivityManager.START_VOICE_NOT_ACTIVE_SESSION:thrownewIllegalStateException("SessioncallingstartVoiceActivitydoesnotmatchactivesession");caseActivityManager.START_VOICE_HIDDEN_SESSION:thrownewIllegalStateException("Cannotstartvoiceactivityonahiddensession");caseActivityManager.START_CANCELED:thrownewAndroidRuntimeException("Activitycouldnotbestartedfor"+intent);default:thrownewAndroidRuntimeException("Unknownerrorcode"+res+"whenstarting"+intent);}}

作用很明显,就是检查启动Activity的结果,当无法正确地启动一个Activity时,这个方法会抛出异常信息,最熟悉的错误就是Unable to find explicit activity classhave you declared this activity in your AndroidManifest.xml?,当启动的Activity没有在AndroidManifest中注册时,就会抛出这个异常。

现在看AMS的startActivity这个方法:

@OverridepublicfinalintstartActivity(IApplicationThreadcaller,StringcallingPackage,Intentintent,StringresolvedType,IBinderresultTo,StringresultWho,intrequestCode,intstartFlags,ProfilerInfoprofilerInfo,BundlebOptions){returnstartActivityAsUser(caller,callingPackage,intent,resolvedType,resultTo,resultWho,requestCode,startFlags,profilerInfo,bOptions,UserHandle.getCallingUserId());}@OverridepublicfinalintstartActivityAsUser(IApplicationThreadcaller,StringcallingPackage,Intentintent,StringresolvedType,IBinderresultTo,StringresultWho,intrequestCode,intstartFlags,ProfilerInfoprofilerInfo,BundlebOptions,intuserId){enforceNotIsolatedCaller("startActivity");userId=mUserController.handleIncomingUser(Binder.getCallingPid(),Binder.getCallingUid(),userId,false,ALLOW_FULL_ONLY,"startActivity",null);//TODO:Switchtouserappstackshere.returnmActivityStarter.startActivityMayWait(caller,-1,callingPackage,intent,resolvedType,null,null,resultTo,resultWho,requestCode,startFlags,profilerInfo,null,null,bOptions,false,userId,null,null);}

从中可以看出,Activity的启动过程又转移到mActivityStarter.startActivityMayWait的方法上,在startActivityMayWait方法中又调用了startActivityLocked方法,然后startActivityLocked方法又调用了startActivityUncheckedLocked方法,最后调用了ActivityStack的resumeTopActivitiesLocked,此时启动过程转移到ActivityStack上。

总结一下,这其中走的流程图如下:

最终,通过源码分析,从IApplicationThread声明方法可以看出,内部包含了大量的启动、停止Activity的接口,此外还包含了启动和停止服务的接口。那么IApplicationThread的实现者到底是什么,答案就是ActivityThread内部的ApplicationThread,ApplicationThread的定义如下:

publicinterfaceIApplicationThreadextendsIInterface{......//省略一部分代码}

我们可以看到IInterface接口有个类型IBinder:

/***BaseclassforBinderinterfaces.Whendefininganewinterface,*youmustderiveitfromIInterface.*/publicinterfaceIInterface{/***RetrievetheBinderobjectassociatedwiththisinterface.*Youmustusethisinsteadofaplaincast,sothatproxyobjects*canreturnthecorrectresult.*/publicIBinderasBinder();}

最终是通过Binder通信,系统为AIDL文件自动生成的代码,同时还有会一个ApplicationThreadProxy类,这个类其实AIDL文件自动生成的代理类,进而最终Activity的启动过程最终回到ApplicationThread中。ApplicationThread通过scheduleLaunchActivity方法启动Activity。

//weusetokentoidentifythisactivitywithouthavingtosendthe//activityitselfbacktotheactivitymanager.(mattersmorewithipc)@OverridepublicfinalvoidscheduleLaunchActivity(Intentintent,IBindertoken,intident,ActivityInfoinfo,ConfigurationcurConfig,ConfigurationoverrideConfig,CompatibilityInfocompatInfo,Stringreferrer,IVoiceInteractorvoiceInteractor,intprocState,Bundlestate,PersistableBundlepersistentState,List<ResultInfo>pendingResults,List<ReferrerIntent>pendingNewIntents,booleannotResumed,booleanisForward,ProfilerInfoprofilerInfo){updateProcessState(procState,false);ActivityClientRecordr=newActivityClientRecord();r.token=token;r.ident=ident;r.intent=intent;r.referrer=referrer;r.voiceInteractor=voiceInteractor;r.activityInfo=info;r.compatInfo=compatInfo;r.state=state;r.persistentState=persistentState;r.pendingResults=pendingResults;r.pendingIntents=pendingNewIntents;r.startsNotResumed=notResumed;r.isForward=isForward;r.profilerInfo=profilerInfo;r.overrideConfig=overrideConfig;updatePendingConfiguration(curConfig);sendMessage(H.LAUNCH_ACTIVITY,r);}

具体实现很简单,就是发送一个启动Activity的消息交由Handler处理,交给H处理,这个H具体类的源码:

privateclassHextendsHandler{publicstaticfinalintLAUNCH_ACTIVITY=100;publicstaticfinalintPAUSE_ACTIVITY=101;publicstaticfinalintPAUSE_ACTIVITY_FINISHING=102;publicstaticfinalintSTOP_ACTIVITY_SHOW=103;publicstaticfinalintSTOP_ACTIVITY_HIDE=104;publicstaticfinalintSHOW_WINDOW=105;publicstaticfinalintHIDE_WINDOW=106;publicstaticfinalintRESUME_ACTIVITY=107;publicstaticfinalintSEND_RESULT=108;publicstaticfinalintDESTROY_ACTIVITY=109;publicstaticfinalintBIND_APPLICATION=110;publicstaticfinalintEXIT_APPLICATION=111;publicstaticfinalintNEW_INTENT=112;publicstaticfinalintRECEIVER=113;publicstaticfinalintCREATE_SERVICE=114;publicstaticfinalintSERVICE_ARGS=115;publicstaticfinalintSTOP_SERVICE=116;publicstaticfinalintCONFIGURATION_CHANGED=118;publicstaticfinalintCLEAN_UP_CONTEXT=119;publicstaticfinalintGC_WHEN_IDLE=120;publicstaticfinalintBIND_SERVICE=121;publicstaticfinalintUNBIND_SERVICE=122;publicstaticfinalintDUMP_SERVICE=123;publicstaticfinalintLOW_MEMORY=124;publicstaticfinalintACTIVITY_CONFIGURATION_CHANGED=125;publicstaticfinalintRELAUNCH_ACTIVITY=126;publicstaticfinalintPROFILER_CONTROL=127;publicstaticfinalintCREATE_BACKUP_AGENT=128;publicstaticfinalintDESTROY_BACKUP_AGENT=129;publicstaticfinalintSUICIDE=130;publicstaticfinalintREMOVE_PROVIDER=131;publicstaticfinalintENABLE_JIT=132;publicstaticfinalintDISPATCH_PACKAGE_BROADCAST=133;publicstaticfinalintSCHEDULE_CRASH=134;publicstaticfinalintDUMP_HEAP=135;publicstaticfinalintDUMP_ACTIVITY=136;publicstaticfinalintSLEEPING=137;publicstaticfinalintSET_CORE_SETTINGS=138;publicstaticfinalintUPDATE_PACKAGE_COMPATIBILITY_INFO=139;publicstaticfinalintTRIM_MEMORY=140;publicstaticfinalintDUMP_PROVIDER=141;publicstaticfinalintUNSTABLE_PROVIDER_DIED=142;publicstaticfinalintREQUEST_ASSIST_CONTEXT_EXTRAS=143;publicstaticfinalintTRANSLUCENT_CONVERSION_COMPLETE=144;publicstaticfinalintINSTALL_PROVIDER=145;publicstaticfinalintON_NEW_ACTIVITY_OPTIONS=146;publicstaticfinalintCANCEL_VISIBLE_BEHIND=147;publicstaticfinalintBACKGROUND_VISIBLE_BEHIND_CHANGED=148;publicstaticfinalintENTER_ANIMATION_COMPLETE=149;publicstaticfinalintSTART_BINDER_TRACKING=150;publicstaticfinalintSTOP_BINDER_TRACKING_AND_DUMP=151;publicstaticfinalintMULTI_WINDOW_MODE_CHANGED=152;publicstaticfinalintPICTURE_IN_PICTURE_MODE_CHANGED=153;publicstaticfinalintLOCAL_VOICE_INTERACTION_STARTED=154;StringcodeToString(intcode){if(DEBUG_MESSAGES){switch(code){caseLAUNCH_ACTIVITY:return"LAUNCH_ACTIVITY";casePAUSE_ACTIVITY:return"PAUSE_ACTIVITY";casePAUSE_ACTIVITY_FINISHING:return"PAUSE_ACTIVITY_FINISHING";caseSTOP_ACTIVITY_SHOW:return"STOP_ACTIVITY_SHOW";caseSTOP_ACTIVITY_HIDE:return"STOP_ACTIVITY_HIDE";caseSHOW_WINDOW:return"SHOW_WINDOW";caseHIDE_WINDOW:return"HIDE_WINDOW";caseRESUME_ACTIVITY:return"RESUME_ACTIVITY";caseSEND_RESULT:return"SEND_RESULT";caseDESTROY_ACTIVITY:return"DESTROY_ACTIVITY";caseBIND_APPLICATION:return"BIND_APPLICATION";caseEXIT_APPLICATION:return"EXIT_APPLICATION";caseNEW_INTENT:return"NEW_INTENT";caseRECEIVER:return"RECEIVER";caseCREATE_SERVICE:return"CREATE_SERVICE";caseSERVICE_ARGS:return"SERVICE_ARGS";caseSTOP_SERVICE:return"STOP_SERVICE";caseCONFIGURATION_CHANGED:return"CONFIGURATION_CHANGED";caseCLEAN_UP_CONTEXT:return"CLEAN_UP_CONTEXT";caseGC_WHEN_IDLE:return"GC_WHEN_IDLE";caseBIND_SERVICE:return"BIND_SERVICE";caseUNBIND_SERVICE:return"UNBIND_SERVICE";caseDUMP_SERVICE:return"DUMP_SERVICE";caseLOW_MEMORY:return"LOW_MEMORY";caseACTIVITY_CONFIGURATION_CHANGED:return"ACTIVITY_CONFIGURATION_CHANGED";caseRELAUNCH_ACTIVITY:return"RELAUNCH_ACTIVITY";casePROFILER_CONTROL:return"PROFILER_CONTROL";caseCREATE_BACKUP_AGENT:return"CREATE_BACKUP_AGENT";caseDESTROY_BACKUP_AGENT:return"DESTROY_BACKUP_AGENT";caseSUICIDE:return"SUICIDE";caseREMOVE_PROVIDER:return"REMOVE_PROVIDER";caseENABLE_JIT:return"ENABLE_JIT";caseDISPATCH_PACKAGE_BROADCAST:return"DISPATCH_PACKAGE_BROADCAST";caseSCHEDULE_CRASH:return"SCHEDULE_CRASH";caseDUMP_HEAP:return"DUMP_HEAP";caseDUMP_ACTIVITY:return"DUMP_ACTIVITY";caseSLEEPING:return"SLEEPING";caseSET_CORE_SETTINGS:return"SET_CORE_SETTINGS";caseUPDATE_PACKAGE_COMPATIBILITY_INFO:return"UPDATE_PACKAGE_COMPATIBILITY_INFO";caseTRIM_MEMORY:return"TRIM_MEMORY";caseDUMP_PROVIDER:return"DUMP_PROVIDER";caseUNSTABLE_PROVIDER_DIED:return"UNSTABLE_PROVIDER_DIED";caseREQUEST_ASSIST_CONTEXT_EXTRAS:return"REQUEST_ASSIST_CONTEXT_EXTRAS";caseTRANSLUCENT_CONVERSION_COMPLETE:return"TRANSLUCENT_CONVERSION_COMPLETE";caseINSTALL_PROVIDER:return"INSTALL_PROVIDER";caseON_NEW_ACTIVITY_OPTIONS:return"ON_NEW_ACTIVITY_OPTIONS";caseCANCEL_VISIBLE_BEHIND:return"CANCEL_VISIBLE_BEHIND";caseBACKGROUND_VISIBLE_BEHIND_CHANGED:return"BACKGROUND_VISIBLE_BEHIND_CHANGED";caseENTER_ANIMATION_COMPLETE:return"ENTER_ANIMATION_COMPLETE";caseMULTI_WINDOW_MODE_CHANGED:return"MULTI_WINDOW_MODE_CHANGED";casePICTURE_IN_PICTURE_MODE_CHANGED:return"PICTURE_IN_PICTURE_MODE_CHANGED";caseLOCAL_VOICE_INTERACTION_STARTED:return"LOCAL_VOICE_INTERACTION_STARTED";}}returnInteger.toString(code);}publicvoidhandleMessage(Messagemsg){if(DEBUG_MESSAGES)Slog.v(TAG,">>>handling:"+codeToString(msg.what));switch(msg.what){caseLAUNCH_ACTIVITY:{Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"activityStart");finalActivityClientRecordr=(ActivityClientRecord)msg.obj;r.packageInfo=getPackageInfoNoCheck(r.activityInfo.applicationInfo,r.compatInfo);handleLaunchActivity(r,null,"LAUNCH_ACTIVITY");Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);}break;caseRELAUNCH_ACTIVITY:{Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"activityRestart");ActivityClientRecordr=(ActivityClientRecord)msg.obj;handleRelaunchActivity(r);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);}break;casePAUSE_ACTIVITY:{Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"activityPause");SomeArgsargs=(SomeArgs)msg.obj;handlePauseActivity((IBinder)args.arg1,false,(args.argi1&USER_LEAVING)!=0,args.argi2,(args.argi1&DONT_REPORT)!=0,args.argi3);maybeSnapshot();Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);}break;casePAUSE_ACTIVITY_FINISHING:{Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"activityPause");SomeArgsargs=(SomeArgs)msg.obj;handlePauseActivity((IBinder)args.arg1,true,(args.argi1&USER_LEAVING)!=0,args.argi2,(args.argi1&DONT_REPORT)!=0,args.argi3);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);}break;caseSTOP_ACTIVITY_SHOW:{Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"activityStop");SomeArgsargs=(SomeArgs)msg.obj;handleStopActivity((IBinder)args.arg1,true,args.argi2,args.argi3);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);}break;caseSTOP_ACTIVITY_HIDE:{Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"activityStop");SomeArgsargs=(SomeArgs)msg.obj;handleStopActivity((IBinder)args.arg1,false,args.argi2,args.argi3);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);}break;caseSHOW_WINDOW:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"activityShowWindow");handleWindowVisibility((IBinder)msg.obj,true);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseHIDE_WINDOW:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"activityHideWindow");handleWindowVisibility((IBinder)msg.obj,false);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseRESUME_ACTIVITY:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"activityResume");SomeArgsargs=(SomeArgs)msg.obj;handleResumeActivity((IBinder)args.arg1,true,args.argi1!=0,true,args.argi3,"RESUME_ACTIVITY");Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseSEND_RESULT:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"activityDeliverResult");handleSendResult((ResultData)msg.obj);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseDESTROY_ACTIVITY:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"activityDestroy");handleDestroyActivity((IBinder)msg.obj,msg.arg1!=0,msg.arg2,false);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseBIND_APPLICATION:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"bindApplication");AppBindDatadata=(AppBindData)msg.obj;handleBindApplication(data);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseEXIT_APPLICATION:if(mInitialApplication!=null){mInitialApplication.onTerminate();}Looper.myLooper().quit();break;caseNEW_INTENT:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"activityNewIntent");handleNewIntent((NewIntentData)msg.obj);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseRECEIVER:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"broadcastReceiveComp");handleReceiver((ReceiverData)msg.obj);maybeSnapshot();Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseCREATE_SERVICE:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,("serviceCreate:"+String.valueOf(msg.obj)));handleCreateService((CreateServiceData)msg.obj);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseBIND_SERVICE:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"serviceBind");handleBindService((BindServiceData)msg.obj);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseUNBIND_SERVICE:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"serviceUnbind");handleUnbindService((BindServiceData)msg.obj);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseSERVICE_ARGS:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,("serviceStart:"+String.valueOf(msg.obj)));handleServiceArgs((ServiceArgsData)msg.obj);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseSTOP_SERVICE:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"serviceStop");handleStopService((IBinder)msg.obj);maybeSnapshot();Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseCONFIGURATION_CHANGED:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"configChanged");mCurDefaultDisplayDpi=((Configuration)msg.obj).densityDpi;mUpdatingSystemConfig=true;handleConfigurationChanged((Configuration)msg.obj,null);mUpdatingSystemConfig=false;Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseCLEAN_UP_CONTEXT:ContextCleanupInfocci=(ContextCleanupInfo)msg.obj;cci.context.performFinalCleanup(cci.who,cci.what);break;caseGC_WHEN_IDLE:scheduleGcIdler();break;caseDUMP_SERVICE:handleDumpService((DumpComponentInfo)msg.obj);break;caseLOW_MEMORY:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"lowMemory");handleLowMemory();Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseACTIVITY_CONFIGURATION_CHANGED:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"activityConfigChanged");handleActivityConfigurationChanged((ActivityConfigChangeData)msg.obj,msg.arg1==1?REPORT_TO_ACTIVITY:!REPORT_TO_ACTIVITY);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;casePROFILER_CONTROL:handleProfilerControl(msg.arg1!=0,(ProfilerInfo)msg.obj,msg.arg2);break;caseCREATE_BACKUP_AGENT:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"backupCreateAgent");handleCreateBackupAgent((CreateBackupAgentData)msg.obj);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseDESTROY_BACKUP_AGENT:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"backupDestroyAgent");handleDestroyBackupAgent((CreateBackupAgentData)msg.obj);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseSUICIDE:Process.killProcess(Process.myPid());break;caseREMOVE_PROVIDER:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"providerRemove");completeRemoveProvider((ProviderRefCount)msg.obj);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseENABLE_JIT:ensureJitEnabled();break;caseDISPATCH_PACKAGE_BROADCAST:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"broadcastPackage");handleDispatchPackageBroadcast(msg.arg1,(String[])msg.obj);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseSCHEDULE_CRASH:thrownewRemoteServiceException((String)msg.obj);caseDUMP_HEAP:handleDumpHeap(msg.arg1!=0,(DumpHeapData)msg.obj);break;caseDUMP_ACTIVITY:handleDumpActivity((DumpComponentInfo)msg.obj);break;caseDUMP_PROVIDER:handleDumpProvider((DumpComponentInfo)msg.obj);break;caseSLEEPING:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"sleeping");handleSleeping((IBinder)msg.obj,msg.arg1!=0);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseSET_CORE_SETTINGS:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"setCoreSettings");handleSetCoreSettings((Bundle)msg.obj);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseUPDATE_PACKAGE_COMPATIBILITY_INFO:handleUpdatePackageCompatibilityInfo((UpdateCompatibilityData)msg.obj);break;caseTRIM_MEMORY:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"trimMemory");handleTrimMemory(msg.arg1);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;caseUNSTABLE_PROVIDER_DIED:handleUnstableProviderDied((IBinder)msg.obj,false);break;caseREQUEST_ASSIST_CONTEXT_EXTRAS:handleRequestAssistContextExtras((RequestAssistContextExtras)msg.obj);break;caseTRANSLUCENT_CONVERSION_COMPLETE:handleTranslucentConversionComplete((IBinder)msg.obj,msg.arg1==1);break;caseINSTALL_PROVIDER:handleInstallProvider((ProviderInfo)msg.obj);break;caseON_NEW_ACTIVITY_OPTIONS:Pair<IBinder,ActivityOptions>pair=(Pair<IBinder,ActivityOptions>)msg.obj;onNewActivityOptions(pair.first,pair.second);break;caseCANCEL_VISIBLE_BEHIND:handleCancelVisibleBehind((IBinder)msg.obj);break;caseBACKGROUND_VISIBLE_BEHIND_CHANGED:handleOnBackgroundVisibleBehindChanged((IBinder)msg.obj,msg.arg1>0);break;caseENTER_ANIMATION_COMPLETE:handleEnterAnimationComplete((IBinder)msg.obj);break;caseSTART_BINDER_TRACKING:handleStartBinderTracking();break;caseSTOP_BINDER_TRACKING_AND_DUMP:handleStopBinderTrackingAndDump((ParcelFileDescriptor)msg.obj);break;caseMULTI_WINDOW_MODE_CHANGED:handleMultiWindowModeChanged((IBinder)msg.obj,msg.arg1==1);break;casePICTURE_IN_PICTURE_MODE_CHANGED:handlePictureInPictureModeChanged((IBinder)msg.obj,msg.arg1==1);break;caseLOCAL_VOICE_INTERACTION_STARTED:handleLocalVoiceInteractionStarted((IBinder)((SomeArgs)msg.obj).arg1,(IVoiceInteractor)((SomeArgs)msg.obj).arg2);break;}Objectobj=msg.obj;if(objinstanceofSomeArgs){((SomeArgs)obj).recycle();}if(DEBUG_MESSAGES)Slog.v(TAG,"<<<done:"+codeToString(msg.what));}privatevoidmaybeSnapshot(){if(mBoundApplication!=null&&SamplingProfilerIntegration.isEnabled()){//convertthe*private*ActivityThread.PackageInfoto*public*known//android.content.pm.PackageInfoStringpackageName=mBoundApplication.info.mPackageName;android.content.pm.PackageInfopackageInfo=null;try{Contextcontext=getSystemContext();if(context==null){Log.e(TAG,"cannotgetavalidcontext");return;}PackageManagerpm=context.getPackageManager();if(pm==null){Log.e(TAG,"cannotgetavalidPackageManager");return;}packageInfo=pm.getPackageInfo(packageName,PackageManager.GET_ACTIVITIES);}catch(NameNotFoundExceptione){Log.e(TAG,"cannotgetpackageinfofor"+packageName,e);}SamplingProfilerIntegration.writeSnapshot(mBoundApplication.processName,packageInfo);}}}

在LAUNCH_ACTIVITY中,可以看到这么一句handleLaunchActivity(r, null, "LAUNCH_ACTIVITY"),最终是交由handleLaunchActivity方法实现,它的源码是:

privatevoidhandleLaunchActivity(ActivityClientRecordr,IntentcustomIntent,Stringreason){//Ifwearegettingreadytogcaftergoingtothebackground,well//wearebackactivesoskipit.unscheduleGcIdler();mSomeActivitiesChanged=true;if(r.profilerInfo!=null){mProfiler.setProfiler(r.profilerInfo);mProfiler.startProfiling();}//Makesurewearerunningwiththemostrecentconfig.handleConfigurationChanged(null,null);if(localLOGV)Slog.v(TAG,"Handlinglaunchof"+r);//InitializebeforecreatingtheactivityWindowManagerGlobal.initialize();Activitya=performLaunchActivity(r,customIntent);if(a!=null){r.createdConfig=newConfiguration(mConfiguration);reportSizeConfigurations(r);BundleoldState=r.state;handleResumeActivity(r.token,false,r.isForward,!r.activity.mFinished&&!r.startsNotResumed,r.lastProcessedSeq,reason);if(!r.activity.mFinished&&r.startsNotResumed){//Theactivitymanageractuallywantsthisonetostartoutpaused,becauseit//needstobevisiblebutisn'tintheforeground.Weaccomplishthisbygoing//throughthenormalstartup(becauseactivitiesexpecttogothroughonResume()//thefirsttimetheyrun,beforetheirwindowisdisplayed),andthenpausingit.//However,inthiscasewedo-not-needtodothefullpausecycle(offreezing//andsuch)becausetheactivitymanagerassumesitcanjustretainthecurrent//stateithas.performPauseActivityIfNeeded(r,reason);//Weneedtokeeparoundtheoriginalstate,incaseweneedtobecreatedagain.//Butweonlydothisforpre-Honeycombapps,whichalwayssavetheirstatewhen//pausing,sowecannothavethemsavetheirstatewhenrestartingfromapaused//state.ForHCandlater,wewantto(andcan)letthestatebesavedasthe//normalpartofstoppingtheactivity.if(r.isPreHoneycomb()){r.state=oldState;}}}else{//Iftherewasanerror,foranyreason,telltheactivitymanagertostopus.try{ActivityManagerNative.getDefault().finishActivity(r.token,Activity.RESULT_CANCELED,null,Activity.DONT_FINISH_TASK_WITH_ACTIVITY);}catch(RemoteExceptionex){throwex.rethrowFromSystemServer();}}}

进而performLaunchActivity方法最终完成了Activity对象的创建和启动过程,并且ActivityThread通过handleResumeActivity方法来调用被启动Activity的onResume这一生命周期方法。

那么performLaunchActivity方法主要完成如下几件事:

从ActivityClientRecord中获取启动的Activity的组件信息

通过Instrumentation的newActivity方法使用类加载器创建Activity对象

通过LoadedApk的makeApplication方法来尝试创建Application对象。值得注意的是在makeApplication方法中如果Application已经被创建过了,那么就不会再重复创建了,这也意味着一个应用只有一个Application对象。同时,Application创建完毕后,系统会调用Application的onCreate方法。

创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化

调用Activity的onCreate方法

源码如下:

privateActivityperformLaunchActivity(ActivityClientRecordr,IntentcustomIntent){//System.out.println("#####["+System.currentTimeMillis()+"]ActivityThread.performLaunchActivity("+r+")");ActivityInfoaInfo=r.activityInfo;if(r.packageInfo==null){r.packageInfo=getPackageInfo(aInfo.applicationInfo,r.compatInfo,Context.CONTEXT_INCLUDE_CODE);}ComponentNamecomponent=r.intent.getComponent();if(component==null){component=r.intent.resolveActivity(mInitialApplication.getPackageManager());r.intent.setComponent(component);}if(r.activityInfo.targetActivity!=null){component=newComponentName(r.activityInfo.packageName,r.activityInfo.targetActivity);}Activityactivity=null;try{java.lang.ClassLoadercl=r.packageInfo.getClassLoader();activity=mInstrumentation.newActivity(cl,component.getClassName(),r.intent);StrictMode.incrementExpectedActivityCount(activity.getClass());r.intent.setExtrasClassLoader(cl);r.intent.prepareToEnterProcess();if(r.state!=null){r.state.setClassLoader(cl);}}catch(Exceptione){if(!mInstrumentation.onException(activity,e)){thrownewRuntimeException("Unabletoinstantiateactivity"+component+":"+e.toString(),e);}}try{Applicationapp=r.packageInfo.makeApplication(false,mInstrumentation);if(localLOGV)Slog.v(TAG,"Performinglaunchof"+r);if(localLOGV)Slog.v(TAG,r+":app="+app+",appName="+app.getPackageName()+",pkg="+r.packageInfo.getPackageName()+",comp="+r.intent.getComponent().toShortString()+",dir="+r.packageInfo.getAppDir());if(activity!=null){ContextappContext=createBaseContextForActivity(r,activity);CharSequencetitle=r.activityInfo.loadLabel(appContext.getPackageManager());Configurationconfig=newConfiguration(mCompatConfiguration);if(r.overrideConfig!=null){config.updateFrom(r.overrideConfig);}if(DEBUG_CONFIGURATION)Slog.v(TAG,"Launchingactivity"+r.activityInfo.name+"withconfig"+config);Windowwindow=null;if(r.mPendingRemoveWindow!=null&&r.mPreserveWindow){window=r.mPendingRemoveWindow;r.mPendingRemoveWindow=null;r.mPendingRemoveWindowManager=null;}activity.attach(appContext,this,getInstrumentation(),r.token,r.ident,app,r.intent,r.activityInfo,title,r.parent,r.embeddedID,r.lastNonConfigurationInstances,config,r.referrer,r.voiceInteractor,window);if(customIntent!=null){activity.mIntent=customIntent;}r.lastNonConfigurationInstances=null;activity.mStartedActivity=false;inttheme=r.activityInfo.getThemeResource();if(theme!=0){activity.setTheme(theme);}activity.mCalled=false;if(r.isPersistable()){mInstrumentation.callActivityOnCreate(activity,r.state,r.persistentState);}else{mInstrumentation.callActivityOnCreate(activity,r.state);}if(!activity.mCalled){thrownewSuperNotCalledException("Activity"+r.intent.getComponent().toShortString()+"didnotcallthroughtosuper.onCreate()");}r.activity=activity;r.stopped=true;if(!r.activity.mFinished){activity.performStart();r.stopped=false;}if(!r.activity.mFinished){if(r.isPersistable()){if(r.state!=null||r.persistentState!=null){mInstrumentation.callActivityOnRestoreInstanceState(activity,r.state,r.persistentState);}}elseif(r.state!=null){mInstrumentation.callActivityOnRestoreInstanceState(activity,r.state);}}if(!r.activity.mFinished){activity.mCalled=false;if(r.isPersistable()){mInstrumentation.callActivityOnPostCreate(activity,r.state,r.persistentState);}else{mInstrumentation.callActivityOnPostCreate(activity,r.state);}if(!activity.mCalled){thrownewSuperNotCalledException("Activity"+r.intent.getComponent().toShortString()+"didnotcallthroughtosuper.onPostCreate()");}}}r.paused=true;mActivities.put(r.token,r);}catch(SuperNotCalledExceptione){throwe;}catch(Exceptione){if(!mInstrumentation.onException(activity,e)){thrownewRuntimeException("Unabletostartactivity"+component+":"+e.toString(),e);}}returnactivity;}

所以借用一张流程图,总体流程时序: