配色: 字号:
Activtiy完全解析(一、Activity的创建过程)
2016-09-07 | 阅:  转:  |  分享 
  
Activtiy完全解析(一、Activity的创建过程)

在Android开发过程中,我们几乎每天都在跟Activity打交道。我们循规蹈矩的调用startActivity()方法便可以打开一个新的界面,但是这个



界面是怎样从无到有我们却不是很清楚,也有很多人根本就没有想过。我们写的layout布局通过setContentView()方法是怎样加载到activity



中,然后又是怎样显示到界面上的?这一系列的问题相信大多数人都不清楚。



也许是因为我们平时的开发过程根本不需要了解这些,但是如果深入了解后,对我们还是很有帮助的。接下来我们用3篇文章去分析一下



Activity从无到显示布局这一过程,第一篇我们就深入研究一下Activity的创建过程。



step1.Activity.startActivtiy()



在Android系统中,我们比较熟悉的打开Activity通常有两种方式,第一种是点击应用程序图标,Launcher会启动应用程序的主Activity,我们



知道Launcher其实也是一个应用程序,他是怎样打开我们的主Activity的呢?在应用程序被安装的时候,系统会找到AndroidManifest.xml中



activity的配置信息,并将action=android.intent.action.MAIN&category=android.intent.category.LAUNCHER的activity记录下来,形成应



用程序与主Activity的映射关系,当点击启动图标时,Launcher就会找到应用程序对应的主activity并将它启动。第二种是当主Activity启动



之后,在应用程序内部可以调用startActivity()开启新的Activity,这种方式又可分为显示启动和隐式启动。不管使用哪种方式启动Activity



,其实最终调用的都是startActivity()方法。所以如果要分析Activity的启动过程,我们就从startActivity()方法分析。跟踪发现Activity



中重载的startActivity()方法最终都是调用startActivityForResult(intent,requestCode,bundle):



publicvoidstartActivityForResult(Intentintent,intrequestCode,Bundleoptions){

//一般Activity的mParent都为null,mParent常用在ActivityGroup中,ActivityGroup已废弃

if(mParent==null){

//启动新的Activity

Instrumentation.ActivityResultar=

mInstrumentation.execStartActivity(

this,mMainThread.getApplicationThread(),mToken,this,

intent,requestCode,options);

if(ar!=null){

//跟踪execStartActivity(),发现开启activity失败ar才可能为null,这时会调用onActivityResult

mMainThread.sendActivityResult(

mToken,mEmbeddedID,requestCode,ar.getResultCode(),

ar.getResultData());

}

...

}else{

//在ActivityGroup内部的Activity调用startActivity的时候会走到这里,处理逻辑和上面是类似的

if(options!=null){

mParent.startActivityFromChild(this,intent,requestCode,options);

}else{

//Notewewanttogothroughthismethodforcompatibilitywith

//existingapplicationsthatmayhaveoverriddenit.

mParent.startActivityFromChild(this,intent,requestCode);

}

}

}

从上面的代码可以发现,开启activity的关键代码是mInstrumentation.execStartActivity(),mInstrumentation是Activity的成员变量,用



于监视系统与应用的互交。



step2.Instrumentation.execStartActivity()



publicActivityResultexecStartActivity(

Contextwho,IBindercontextThread,IBindertoken,Stringtarget,

Intentintent,intrequestCode,Bundleoptions){

IApplicationThreadwhoThread=(IApplicationThread)contextThread;

//mActivityMonitors是所有ActivityMonitor的集合,用于监视应用的Activity(记录状态)

if(mActivityMonitors!=null){

synchronized(mSync){

//先查找一遍看是否存在这个activity

finalintN=mActivityMonitors.size();

for(inti=0;i
finalActivityMonitoram=mActivityMonitors.get(i);

if(am.match(who,null,intent)){

//如果找到了就跳出循环

am.mHits++;

//如果目标activity无法打开,直接return

if(am.isBlocking()){

returnrequestCode>=0?am.getResult():null;

}

break;

}

}

}

}

try{

intent.migrateExtraStreamToClipData();

intent.prepareToLeaveProcess();

//这里才是真正开启activity的地方,ActivityManagerNative中实际上调用的是ActivityManagerProxy的方法

intresult=ActivityManagerNative.getDefault()

.startActivity(whoThread,who.getBasePackageName(),intent,

intent.resolveTypeIfNeeded(who.getContentResolver()),

token,target,requestCode,0,null,options);

//checkStartActivityResult方法是抛异常专业户,它对上面开启activity的结果进行检查,如果无法打开activity,

//则抛出诸如ActivityNotFoundException类似的各种异常

checkStartActivityResult(result,intent);

}catch(RemoteExceptione){

thrownewRuntimeException("Failurefromsystem",e);

}

returnnull;

}

mInstrumentation的execStartActivity()方法中首先检查activity是否能打开,如果不能打开直接返回,否则继续调用



ActivityManagerNative.getDefault().startActivity()开启activity,然后检查开启结果,如果开启失败,会抛出异常(比如未在



AndroidManifest.xml注册)。接着我们转入ActivityManagerNative中:



step3.ActivityManagerNative



??在讲解此步骤之前,先大致介绍一下ActivityManagerNative这个抽象类。ActivityManagerNative继承自Binder(实现了IBinder),实现了



IActivityManager接口,但是没有实现他的抽象方法。

??ActivityManagerNative中有一个内部类ActivityManagerProxy,ActivityManagerProxy也实现了IActivityManager接口,并实现了



IActivityManager中所有的方法。IActivityManager里面有很多像startActivity()、startService()、bindService()、registerReveicer()



等方法,它为Activity管理器提供了统一的API。

??ActivityManagerNative通过getDefault()获取到一个ActivityManagerProxy的示例,并将远程代理对象IBinder传递给他,然后调用他的



starXxx方法开启Service、Activity或者registReceiver,可以看出ActivityManagerNative只是一个装饰类,真正工作的是其内部类



ActivityManagerProxy。



①.ActivtiyManagerNative.getDefault().startActivity()



staticpublicIActivityManagergetDefault(){

//此处返回的IActivityManager示例是ActivityManagerProxy的对象

returngDefault.get();

}

privatestaticfinalSingletongDefault=newSingleton(){

protectedIActivityManagercreate(){

//android.os.ServiceManager中维护了HashMapsCache,他是系统Service对应的IBinder代理对象的集合

//通过名称获取到ActivityManagerService对应的IBinder远程代理对象

IBinderb=ServiceManager.getService("activity");

if(false){

Log.v("ActivityManager","defaultservicebinder="+b);

}

//返回一个IActivityManager对象,这个对象实际上是ActivityManagerProxy的对象

IActivityManageram=asInterface(b);

if(false){

Log.v("ActivityManager","defaultservice="+am);

}

returnam;

}

};

staticpublicIActivityManagerasInterface(IBinderobj){

if(obj==null){

returnnull;

}

IActivityManagerin=

(IActivityManager)obj.queryLocalInterface(descriptor);

if(in!=null){

returnin;

}

//返回ActivityManagerProxy对象

returnnewActivityManagerProxy(obj);

}

ActivityManagerNative中的方法只是获取到ActivityManagerProxy的实例,然后调用其startActivity方法:



②.ActivtiyManagerProxy.startActivity()



publicintstartActivity(IApplicationThreadcaller,StringcallingPackage,Intentintent,

StringresolvedType,IBinderresultTo,StringresultWho,intrequestCode,

intstartFlags,ProfilerInfoprofilerInfo,Bundleoptions)throwsRemoteException{

Parceldata=Parcel.obtain();

Parcelreply=Parcel.obtain();

//下面的代码将参数持久化,便于ActivityManagerService中获取

data.writeInterfaceToken(IActivityManager.descriptor);

data.writeStrongBinder(caller!=null?caller.asBinder():null);

data.writeString(callingPackage);

intent.writeToParcel(data,0);

data.writeString(resolvedType);

data.writeStrongBinder(resultTo);

data.writeString(resultWho);

data.writeInt(requestCode);

data.writeInt(startFlags);

if(profilerInfo!=null){

data.writeInt(1);

profilerInfo.writeToParcel(data,Parcelable.PARCELABLE_WRITE_RETURN_VALUE);

}else{

data.writeInt(0);

}

if(options!=null){

data.writeInt(1);

options.writeToParcel(data,0);

}else{

data.writeInt(0);

}

//mRemote就是ActivityManagerService的远程代理对象,这句代码之后就进入到ActivityManagerService中了

mRemote.transact(START_ACTIVITY_TRANSACTION,data,reply,0);

reply.readException();

intresult=reply.readInt();

reply.recycle();

data.recycle();

returnresult;

}

上面说到ActivityManagerNative才是真正干活的,他维护了ActivityManagerService的远程代理对象mRemote,最终会通过mRemote将开启



Activity的消息传送给ActivityManagerService,这样就来到了ActivityManagerService的startActivity方法中:



step4.ActivityManagerService



publicfinalclassActivityManagerServiceextendsActivityManagerNative

implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{

...



@Override

publicfinalintstartActivity(IApplicationThreadcaller,StringcallingPackage,

Intentintent,StringresolvedType,IBinderresultTo,StringresultWho,intrequestCode,

intstartFlags,ProfilerInfoprofilerInfo,Bundleoptions){

returnstartActivityAsUser(caller,callingPackage,intent,resolvedType,resultTo,

resultWho,requestCode,startFlags,profilerInfo,options,

UserHandle.getCallingUserId());

}



@Override

publicfinalintstartActivityAsUser(IApplicationThreadcaller,StringcallingPackage,

Intentintent,StringresolvedType,IBinderresultTo,StringresultWho,int



requestCode,

intstartFlags,ProfilerInfoprofilerInfo,Bundleoptions,intuserId){

enforceNotIsolatedCaller("startActivity");

userId=handleIncomingUser(Binder.getCallingPid(),Binder.getCallingUid(),userId,

false,ALLOW_FULL_ONLY,"startActivity",null);

//mStackSupervisor的类型是ActivityStackSupervisor

returnmStackSupervisor.startActivityMayWait(caller,-1,callingPackage,intent,

resolvedType,null,null,resultTo,resultWho,requestCode,startFlags,

profilerInfo,null,null,options,userId,null,null);

}



...

}

ActivityManagerService中startActivity()直接调用了startActivityAsUser()方法,这个方法中又调用了ActivitySupervisor的



startActivityMayWait()方法:



step5.ActivityStackSupervisor.startActivityMayWait()



finalintstartActivityMayWait(IApplicationThreadcaller,intcallingUid,

StringcallingPackage,Intentintent,StringresolvedType,

IVoiceInteractionSessionvoiceSession,IVoiceInteractorvoiceInteractor,

IBinderresultTo,StringresultWho,intrequestCode,intstartFlags,

ProfilerInfoprofilerInfo,WaitResultoutResult,Configurationconfig,

Bundleoptions,intuserId,IActivityContaineriContainer,TaskRecordinTask){

...



//Don''tmodifytheclient''sobject!

intent=newIntent(intent);



//调用resolveActivity()根据意图intent参数,解析目标Activity的一些信息保存到aInfo中,

//这些信息包括activity的name、applicationInfo、processName、theme、launchMode、permission、flags等等

//这都是在AndroidManifest.xml中为activity配置的

ActivityInfoaInfo=resolveActivity(intent,resolvedType,startFlags,

profilerInfo,userId);



...

synchronized(mService){

//下面省略的代码用于重新组织startActivityLocked()方法需要的参数

...

//调用startActivityLocked开启目标activity

intres=startActivityLocked(caller,intent,resolvedType,aInfo,

voiceSession,voiceInteractor,resultTo,resultWho,

requestCode,callingPid,callingUid,callingPackage,

realCallingPid,realCallingUid,startFlags,options,

componentSpecified,null,container,inTask);

...



if(outResult!=null){

//如果outResult不为null,则设置开启activity的结果

outResult.result=res;

...



returnres;

}

}

根据上面传递的参数和应用信息重新封装一些参数,然后调用startActivityLocked()方法:



step6.ActivityStackSupervisor.startActivityLocked()



finalintstartActivityLocked(IApplicationThreadcaller,

Intentintent,StringresolvedType,ActivityInfoaInfo,

IVoiceInteractionSessionvoiceSession,IVoiceInteractorvoiceInteractor,

IBinderresultTo,StringresultWho,intrequestCode,

intcallingPid,intcallingUid,StringcallingPackage,

intrealCallingPid,intrealCallingUid,intstartFlags,Bundleoptions,

booleancomponentSpecified,ActivityRecord[]outActivity,ActivityContainercontainer,

TaskRecordinTask){

interr=ActivityManager.START_SUCCESS;

//调用者的进程信息,也就是哪个进程要开启此Activity的

ProcessRecordcallerApp=null;

//下面有很多if语句,用于判断一些错误信息,并给err赋值相应的错误码

if(caller!=null){

callerApp=mService.getRecordForAppLocked(caller);

if(callerApp!=null){

callingPid=callerApp.pid;

callingUid=callerApp.info.uid;

}else{

err=ActivityManager.START_PERMISSION_DENIED;

}

}

...

if(err==ActivityManager.START_SUCCESS&&intent.getComponent()==null){

err=ActivityManager.START_INTENT_NOT_RESOLVED;

}

if(err==ActivityManager.START_SUCCESS&&aInfo==null){

//未找到需要打开的activity的class文件

err=ActivityManager.START_CLASS_NOT_FOUND;

}

...

//上面判断完成之后,接着判断如果err不为START_SUCCESS,则说明开启activity失败,直接返回错误码

if(err!=ActivityManager.START_SUCCESS){

if(resultRecord!=null){

resultStack.sendActivityResultLocked(-1,

resultRecord,resultWho,requestCode,

Activity.RESULT_CANCELED,null);

}

ActivityOptions.abort(options);

returnerr;

}



//检查权限,有些activity在清单文件中注册了权限,比如要开启系统相机,就需要注册相机权限,否则此处就会跑出异常

finalintstartAnyPerm=mService.checkPermission(

START_ANY_ACTIVITY,callingPid,callingUid);

finalintcomponentPerm=mService.checkComponentPermission(aInfo.permission,callingPid,

callingUid,aInfo.applicationInfo.uid,aInfo.exported);

if(startAnyPerm!=PERMISSION_GRANTED&&componentPerm!=PERMISSION_GRANTED){

if(resultRecord!=null){

resultStack.sendActivityResultLocked(-1,

resultRecord,resultWho,requestCode,

Activity.RESULT_CANCELED,null);

}

Stringmsg;

//权限被拒绝,抛出异常

if(!aInfo.exported){

msg="PermissionDenial:starting"+intent.toString()

+"from"+callerApp+"(pid="+callingPid

+",uid="+callingUid+")"

+"notexportedfromuid"+aInfo.applicationInfo.uid;

}else{

msg="PermissionDenial:starting"+intent.toString()

+"from"+callerApp+"(pid="+callingPid

+",uid="+callingUid+")"

+"requires"+aInfo.permission;

}

thrownewSecurityException(msg);

}



//★★★经过上面的判断后,创建一个新的Activity记录,

//这个ActivityRecord就是被创建的activity在历史堆栈中的一个条目,表示一个活动

ActivityRecordr=newActivityRecord(mService,callerApp,callingUid,callingPackage,

intent,resolvedType,aInfo,mService.mConfiguration,resultRecord,resultWho,

requestCode,componentSpecified,this,container,options);

...

//继续调用startActivityUncheckedLocked()

err=startActivityUncheckedLocked(r,sourceRecord,voiceSession,voiceInteractor,

startFlags,true,options,inTask);

...

returnerr;

}

这个方法主要是判断一些错误信息和检查权限,如果没有发现错误(err==START_SUCCESS)就继续开启activity,否则直接返回错误码。继续



查看startActivityUnChechedLocked()方法:



step7:ActivityStackSupervisor.startActivityUncheckedLocked()



finalintstartActivityUncheckedLocked(ActivityRecordr,ActivityRecordsourceRecord,

IVoiceInteractionSessionvoiceSession,IVoiceInteractorvoiceInteractor,int



startFlags,

booleandoResume,Bundleoptions,TaskRecordinTask){

...

//①获取并配置activity配置的启动模式

intlaunchFlags=intent.getFlags();

if((launchFlags&Intent.FLAG_ACTIVITY_NEW_DOCUMENT)!=0&&

(launchSingleInstance||launchSingleTask)){

launchFlags&=

~(Intent.FLAG_ACTIVITY_NEW_DOCUMENT|Intent.FLAG_ACTIVITY_MULTIPLE_TASK);

}else{

...

}

...

/

如果调用者不是来自另一个activity(不是在activity中调用startActivity),

但是给了我们用于放入心activity的一个明确的task,将执行下面代码



我们往上追溯,发现inTask是step4中ActivityManagerService.startActivityAsUser()方法传递的null,

所以if里面的不会执行

/

if(sourceRecord==null&&inTask!=null&&inTask.stack!=null){

...

}else{

inTask=null;

}

//根据activity的设置,如果满足下列条件,将launchFlags置为FLAG_ACTIVITY_NEW_TASK(创建新进程)

if(inTask==null){

if(sourceRecord==null){

//Thisactivityisnotbeingstartedfromanother...inthis

//casewe-always-startanewtask.

//如果调用者为null,将launchFlags置为创建一个新进程

if((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK)==0&&inTask==null){

launchFlags|=Intent.FLAG_ACTIVITY_NEW_TASK;

}

}elseif(sourceRecord.launchMode==ActivityInfo.LAUNCH_SINGLE_INSTANCE){

//如果调用者的模式是SINGLE_INSTANCE,需要开启新进程

launchFlags|=Intent.FLAG_ACTIVITY_NEW_TASK;

}elseif(launchSingleInstance||launchSingleTask){

//如果需要开启的activity的模式是SingleInstance或者SingleTask,也需要开新进程

launchFlags|=Intent.FLAG_ACTIVITY_NEW_TASK;

}

}



ActivityInfonewTaskInfo=null;//新进程

IntentnewTaskIntent=null;

ActivityStacksourceStack;//调用者所在的进程

//下面省略的代码是为上面三个变量赋值

...



/

②我们尝试将新的activity放在一个现有的任务中。但是如果activity被要求是singleTask或者singleInstance,

我们会将activity放入一个新的task中.下面的if中主要处理将目标进程置于栈顶,然后将目标activity显示

/

if(((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK)!=0&&

(launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK)==0)

||launchSingleInstance||launchSingleTask){

//如果被开启的activity不是需要开启新的进程,而是singleinstance或者singleTask,

if(inTask==null&&r.resultTo==null){

//检查此activity是否已经开启了,findTaskLocked()方法用于查找目标activity所在的进程

ActivityRecordintentActivity=!launchSingleInstance?

findTaskLocked(r):findActivityLocked(intent,r.info);

if(intentActivity!=null){

...

targetStack=intentActivity.task.stack;

...

//如果目标activity已经开启,目标进程不在堆栈顶端,我们需要将它置顶

finalActivityStacklastStack=getLastStack();

ActivityRecordcurTop=lastStack==null?null:lastStack.topRunningNonDelayedActivityLocked(notTop);

booleanmovedToFront=false;

if(curTop!=null&&(curTop.task!=intentActivity.task||

curTop.task!=lastStack.topTask())){

r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

if(sourceRecord==null||(sourceStack.topActivity()!=null&&

sourceStack.topActivity().task==sourceRecord.task)){

...

//置顶进程

targetStack.moveTaskToFrontLocked(intentActivity.task,r,options,

"bringingFoundTaskToFront");

...

movedToFront=true;

}

}

...

if((launchFlags&

(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK))

==(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)){

//如果调用者要求完全替代已经存在的进程

reuseTask=intentActivity.task;

reuseTask.performClearTaskLocked();

reuseTask.setIntent(r);

}elseif((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP)!=0

||launchSingleInstance||launchSingleTask){

//将进程堆栈中位于目标activity上面的其他activitys清理掉

ActivityRecordtop=intentActivity.task.performClearTaskLocked(r,launchFlags);

}elseif(r.realActivity.equals(intentActivity.task.realActivity)){

//如果进程最上面的activity就是目标activity,进行一些设置操作

...

}elseif((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)==0){

...

}elseif(!intentActivity.task.rootWasReset){

...

}

if(!addingToTask&&reuseTask==null){

//让目标activity显示,会调用onResume

if(doResume){

targetStack.resumeTopActivityLocked(null,options);

}else{

ActivityOptions.abort(options);

}

//直接返回

returnActivityManager.START_TASK_TO_FRONT;

}

}

}

}



//③判断包名是否解析成功,如果包名解析不成功无法开启activity

if(r.packageName!=null){

//当前处于堆栈顶端的进程和activity

ActivityStacktopStack=getFocusedStack();

ActivityRecordtop=topStack.topRunningNonDelayedActivityLocked(notTop);

if(top!=null&&r.resultTo==null){

if(top.realActivity.equals(r.realActivity)&&top.userId==r.userId){

if(top.app!=null&&top.app.thread!=null){

if((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP)!=0

||launchSingleTop||launchSingleTask){

ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT,top,

top.task);

...

returnActivityManager.START_DELIVERED_TO_TOP;

}

}

}

}



}else{

//包名为空,直接返回,没有找到要打开的activity

...

returnActivityManager.START_CLASS_NOT_FOUND;

}



//④判断activiy应该在那个进程中启动,如果该进程中已经存在目标activity,根据启动模式做相应处理

...

//判断是否需要开启新进程?

booleannewTask=false;

if(r.resultTo==null&&inTask==null&&!addingToTask

&&(launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK)!=0){

...

newTask=true;//如果有FLAG_ACTIVITY_NEW_TASK标志,将为目标activity开启新的进程

targetStack=adjustStackFocus(r,newTask);

if(!launchTaskBehind){

targetStack.moveToFront("startingNewTask");

}

if(reuseTask==null){

r.setTask(targetStack.createTaskRecord(getNextTaskId(),

newTaskInfo!=null?newTaskInfo:r.info,

newTaskIntent!=null?newTaskIntent:intent,

voiceSession,voiceInteractor,!launchTaskBehind/toTop/),

taskToAffiliate);

if(DEBUG_TASKS)Slog.v(TAG,"Startingnewactivity"+r+"innewtask"+

r.task);

}else{

r.setTask(reuseTask,taskToAffiliate);

}

...

}elseif(sourceRecord!=null){

//调用者不为空

finalTaskRecordsourceTask=sourceRecord.task;

//默认在调用者所在进程启动,需要将进程置前

targetStack=sourceTask.stack;

targetStack.moveToFront("sourceStackToFront");

finalTaskRecordtopTask=targetStack.topTask();

if(topTask!=sourceTask){

targetStack.moveTaskToFrontLocked(sourceTask,r,options,"sourceTaskToFront");

}

if(!addingToTask&&(launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP)!=0){

//没有FLAG_ACTIVITY_CLEAR_TOP标志时,开启activity

ActivityRecordtop=sourceTask.performClearTaskLocked(r,launchFlags);

if(top!=null){

ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT,r,top.task);

top.deliverNewIntentLocked(callingUid,r.intent,r.launchedFromPackage);

...

targetStack.resumeTopActivityLocked(null);

returnActivityManager.START_DELIVERED_TO_TOP;

}

}elseif(!addingToTask&&

(launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)!=0){

//如果activity在当前进程中已经开启,清除位于他之上的activity

finalActivityRecordtop=sourceTask.findActivityInHistoryLocked(r);

if(top!=null){

finalTaskRecordtask=top.task;

task.moveActivityToFrontLocked(top);

ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT,r,task);

...

returnActivityManager.START_DELIVERED_TO_TOP;

}

}

r.setTask(sourceTask,null);

if(DEBUG_TASKS)Slog.v(TAG,"Startingnewactivity"+r+"inexistingtask"+r.task+"fromsource"+



sourceRecord);



}elseif(inTask!=null){

//在调用者指定的确定的进程中开启目标activity

...

if(DEBUG_TASKS)Slog.v(TAG,"Startingnewactivity"+r+"inexplicittask"+r.task);

}else{

...

}



...

ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY,r,r.task);

targetStack.mLastPausedActivity=null;

//⑤继续调用目标堆栈ActivityStack的startActivityLocked()方法,这个方法没有返回值,执行完毕之后直接返回START_SUCCESS

targetStack.startActivityLocked(r,newTask,doResume,keepCurTransition,options);

if(!launchTaskBehind){

//Don''tsetfocusonanactivitythat''sgoingtotheback.

mService.setFocusedActivityLocked(r,"startedActivity");

}

returnActivityManager.START_SUCCESS;

}

通过第6步,新的activity记录已经创建了,接下来就是将这个activity放入到某个进程堆栈中;

??startActivityLocked()中首先获取activity的启动模式(AndroidManifest.xml中为activity配置的launchMode属性值),



启动模式一共有四种:

ActivityInfo.LAUNCH_MULTIPLE(standard标准)、

ActivityInfo.LAUNCH_SINGLE_INSTANCE(全局单例)、

ActivityInfo.LAUNCH_SINGLE_TASK(进程中单例)、

ActivityInfo.LAUNCH_SINGLE_TOP(栈顶单例)

不清楚的可以参考官方网站:

http://developer.android.com/reference/android/content/pm/ActivityInfo.html

??如果目标activity已经在某个历史进程中存在,需要根据启动模式分别判断并做相应处理。举个例子:如果启动模式为



LAUNCH_SINGLE_INSTANCE,发现目标activity在某个进程中已经被启动过,这时候就将此进程置于进程堆栈栈顶,然后清除位于目标activity



之上的activity,这样目标activity就位于栈顶了,这种情况就算是activity启动成功,直接返回。

??通过上面的判断处理,发现必须创建新的activity,并将其放入到某个进程中,就会进一步获取需要栖息的进程堆栈targetStack(创建新进



程or已有的进程),最后调用(ActivityStack)targetStack.startActivityLocked()方法:



step8:ActivityStack.startActivityLocked()



??ActivityStack用于管理activity的堆栈状态,startActivityLocked()方法就是将某个activity记录放入堆栈中,下面看看源码:



finalvoidstartActivityLocked(ActivityRecordr,booleannewTask,

booleandoResume,booleankeepCurTransition,Bundleoptions){

TaskRecordrTask=r.task;

finalinttaskId=rTask.taskId;

//mLaunchTaskBehindtasksgetplacedatthebackofthetaskstack.

if(!r.mLaunchTaskBehind&&(taskForIdLocked(taskId)==null||newTask)){

//LastactivityintaskhadbeenremovedorActivityManagerServiceisreusingtask.

//Insertorreplace.

//Mightnotevenbein.

insertTaskAtTop(rTask);

mWindowManager.moveTaskToTop(taskId);

}

TaskRecordtask=null;

//①.不用创建新进程的情况,需要做一些任务切换操作

if(!newTask){

booleanstartIt=true;

//遍历所有的任务,找到目标activity所在的堆栈,taskNdx为所有的task的数量,肯定是大于0

for(inttaskNdx=mTaskHistory.size()-1;taskNdx>=0;--taskNdx){

task=mTaskHistory.get(taskNdx);

if(task.getTopActivity()==null){

//如果进程中activity为空,继续遍历

continue;

}

if(task==r.task){

//如果当前task==需要开启的activity的进程

if(!startIt){

if(DEBUG_ADD_REMOVE)Slog.i(TAG,"Addingactivity"+r+"totask"

+task,newRuntimeException("here").fillInStackTrace());

//将需要启动的activity的记录放入task堆栈的顶层

task.addActivityToTop(r);

r.putInHistory();

mWindowManager.addAppToken(task.mActivities.indexOf(r),r.appToken,

r.task.taskId,mStackId,r.info.screenOrientation,r.fullscreen,

(r.info.flags&ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN)!=0,

r.userId,r.info.configChanges,task.voiceSession!=null,

r.mLaunchTaskBehind);

...

return;

}

break;

}elseif(task.numFullscreen>0){

startIt=false;

}

}

}



//②.在处于栈顶的进程中放置新的activity,这个activity将是即将和用户交互的界面

task=r.task;

//将activity插入历史堆栈顶层

task.addActivityToTop(r);

task.setFrontOfTask();

r.putInHistory();

if(!isHomeStack()||numActivities()>0){

/

如果我们需要切换到一个新的任务,或者下一个activity不是当前正在运行的,

我们需要显示启动预览窗口,在这里可能执行一切窗口切换的动画效果

/

booleanshowStartingIcon=newTask;

ProcessRecordproc=r.app;

...

if((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION)!=0){

mWindowManager.prepareAppTransition(AppTransition.TRANSIT_NONE,keepCurTransition);

mNoAnimActivities.add(r);

}else{

//执行切换动画

mWindowManager.prepareAppTransition(...);

mNoAnimActivities.remove(r);

}

mWindowManager.addAppToken(task.mActivities.indexOf(r),

r.appToken,r.task.taskId,mStackId,r.info.screenOrientation,r.fullscreen,

(r.info.flags&ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN)!=0,r.userId,

r.info.configChanges,task.voiceSession!=null,r.mLaunchTaskBehind);

...

}else{

/

如果需要启动的activity的信息已经是堆栈中第一个,不需要执行动画

/

mWindowManager.addAppToken(task.mActivities.indexOf(r),r.appToken,

r.task.taskId,mStackId,r.info.screenOrientation,r.fullscreen,

(r.info.flags&ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN)!=0,r.userId,

r.info.configChanges,task.voiceSession!=null,r.mLaunchTaskBehind);

...

}

...

if(doResume){

//此处的doResume参数为true,继续调用ActivityStackSupervisor.resumeTopActivitiesLocked()

mStackSupervisor.resumeTopActivitiesLocked(this,r,options);

}

}

这个方法中主要进行一些堆栈切换工作,将目标activity所在的堆栈置顶,然后再栈顶放入新的activtiy记录,最后调用



mStackSupervisor.resumeTopActivitiesLocked(this,r,options)方法将位于栈顶的activity显示出来:



step9:ActivityStackSupervisor.resumeTopActivitiesLocked()



booleanresumeTopActivitiesLocked(ActivityStacktargetStack,ActivityRecordtarget,

BundletargetOptions){

if(targetStack==null){

targetStack=getFocusedStack();

}

//DotargetStackfirst.

booleanresult=false;

//是否是栈顶的任务

if(isFrontStack(targetStack)){

result=targetStack.resumeTopActivityLocked(target,targetOptions);

}

for(intdisplayNdx=mActivityDisplays.size()-1;displayNdx>=0;--displayNdx){

finalArrayListstacks=mActivityDisplays.valueAt(displayNdx).mStacks;

for(intstackNdx=stacks.size()-1;stackNdx>=0;--stackNdx){

finalActivityStackstack=stacks.get(stackNdx);

if(stack==targetStack){

//Alreadystartedabove.

continue;

}

if(isFrontStack(stack)){

//会调用resumeTopActivityLocked(ActivityRecordprev,Bundleoptions)

stack.resumeTopActivityLocked(null);

}

}

}

returnresult;

}

这一步紧接着调用ActivityStack.resumeTopActivityLocked():



step10:ActivityStack.resumeTopActivityLocked()



finalbooleanresumeTopActivityLocked(ActivityRecordprev,Bundleoptions){

if(mStackSupervisor.inResumeTopActivity){

//Don''tevenstartrecursing.

returnfalse;

}



booleanresult=false;

try{

//Protectagainstrecursion.

mStackSupervisor.inResumeTopActivity=true;

if(mService.mLockScreenShown==ActivityManagerService.LOCK_SCREEN_LEAVING){

mService.mLockScreenShown=ActivityManagerService.LOCK_SCREEN_HIDDEN;

mService.updateSleepIfNeededLocked();

}

//继续调用resumeTopActivityInnerLocked()

result=resumeTopActivityInnerLocked(prev,options);

}finally{

mStackSupervisor.inResumeTopActivity=false;

}

returnresult;

}



resumeTopActivityLocked()方法继续调用resumeTopActivityInnerLocked()方法:



finalbooleanresumeTopActivityInnerLocked(ActivityRecordprev,Bundleoptions){

...



//Weneedtostartpausingthecurrentactivitysothetopone

//canberesumed...

//①需要将现在的activity置于pausing状态,然后才能将栈顶的activity处于resume状态

booleandontWaitForPause=(next.info.flags&ActivityInfo.FLAG_RESUME_WHILE_PAUSING)!=0;

booleanpausing=mStackSupervisor.pauseBackStacks(userLeaving,true,dontWaitForPause);

if(mResumedActivity!=null){

if(DEBUG_STATES)Slog.d(TAG,"resumeTopActivityLocked:Pausing"+mResumedActivity);

pausing|=startPausingLocked(userLeaving,false,true,dontWaitForPause);

}

...



//Launchingthisapp''sactivity,makesuretheappisnolonger

//consideredstopped.

//②启动栈顶的activity

try{

AppGlobals.getPackageManager().setPackageStoppedState(

next.packageName,false,next.userId);/TODO:Verifyifcorrectuserid/

}catch(RemoteExceptione1){

}catch(IllegalArgumentExceptione){

Slog.w(TAG,"Failedtryingtounstoppackage"

+next.packageName+":"+e);

}

...



//③判断栈顶activity是否启动,如果已经启动将其置为resume状态,如果没有启动将重新启动activity

if(next.app!=null&&next.app.thread!=null){

//如果栈顶的activity不为空,并且其thread成员(ApplicationThread)不为空,说明activity已经启动(执行了attach())

if(DEBUG_SWITCH)Slog.v(TAG,"Resumerunning:"+next);

//Thisactivityisnowbecomingvisible.

mWindowManager.setAppVisibility(next.appToken,true);

...

try{

...

next.sleeping=false;

mService.showAskCompatModeDialogLocked(next);

next.app.pendingUiClean=true;

next.app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_TOP);

next.clearOptionsLocked();

//回调activity的onResume()方法

next.app.thread.scheduleResumeActivity(next.appToken,next.app.repProcState,

mService.isNextTransitionForward(),resumeAnimOptions);

...

}catch(Exceptione){



//抛异常后,需要启动activity

mStackSupervisor.startSpecificActivityLocked(next,true,false);

if(DEBUG_STACK)mStackSupervisor.validateTopActivitiesLocked();

returntrue;

}

...

}else{

//否则需要重新启动activity

...

mStackSupervisor.startSpecificActivityLocked(next,true,true);

}

returntrue;

}

在resumeTopActivityInnerLocked()中,主要会经历三个步骤,第一步需要将当前正在显示的activity置于pausing状态;然后启动栈顶的



activity(也就是目标activity),如果目标activity已经被启动过,会将其置于resume状态;否则将重新启动activity,由于现在我们研究的



acivity的启动,所以继续跟踪ActivityStackSupervisor.startSpecificActivityLocked():



step11:ActivityStackSupervisor.startSpecificActivityLocked()



voidstartSpecificActivityLocked(ActivityRecordr,

booleanandResume,booleancheckConfig){

//判断activity所属的应用程序的进程(process+uid)是否已经启动

ProcessRecordapp=mService.getProcessRecordLocked(r.processName,

r.info.applicationInfo.uid,true);

r.task.stack.setLaunchTime(r);

if(app!=null&&app.thread!=null){

try{

...

/

①如果应用已经启动,并且进程中的thread对象不为空,

调用realStartActivityLocked()方法创建activity对象



继续跟下去,会发现调用activity的onCreate方法

/

realStartActivityLocked(r,app,andResume,checkConfig);

return;

}catch(RemoteExceptione){

Slog.w(TAG,"Exceptionwhenstartingactivity"

+r.intent.getComponent().flattenToShortString(),e);

}

//Ifadeadobjectexceptionwasthrown--fallthroughto

//restarttheapplication.

}

//②如果抛出了异常或者获取的应用进程为空,需用重新启动应用程序,点击Launcher桌面上图表时走这里

mService.startProcessLocked(r.processName,r.info.applicationInfo,true,0,

"activity",r.intent.getComponent(),false,false,true);

}

这个方法用于判断需要开启的activity所在的进程是否已经启动,如果已经启动,会执行第①中情况开启activity,如果没有启动,将会走



第②中情况,先去启动进程,然后在开启activity。由于第②种情况是一个比较完整的过程,并且后面也会调用realStartActivityLocked()



方法开启activity,所以,我们继续分析第②种情况:



step12:ActivityManagerService.startProcessLocked()



finalProcessRecordstartProcessLocked(StringprocessName,

ApplicationInfoinfo,booleanknownToBeDead,intintentFlags,

StringhostingType,ComponentNamehostingName,booleanallowWhileBooting,

booleanisolated,booleankeepIfLarge){

returnstartProcessLocked(processName,info,knownToBeDead,intentFlags,hostingType,

hostingName,allowWhileBooting,isolated,0/isolatedUid/,keepIfLarge,

null/ABIoverride/,null/entryPoint/,null/entryPointArgs/,

null/crashHandler/);

}

finalProcessRecordstartProcessLocked(StringprocessName,ApplicationInfoinfo,

booleanknownToBeDead,intintentFlags,StringhostingType,ComponentNamehostingName,

booleanallowWhileBooting,booleanisolated,intisolatedUid,booleankeepIfLarge,

StringabiOverride,StringentryPoint,String[]entryPointArgs,RunnablecrashHandler)



{

longstartTime=SystemClock.elapsedRealtime();

ProcessRecordapp;

//isolated==false

if(!isolated){

//再次检查是否已经有以process+uid命名的进程存在

app=getProcessRecordLocked(processName,info.uid,keepIfLarge);

checkTime(startTime,"startProcess:aftergetProcessRecord");

}else{

app=null;

}

//接下来有一些if语句,用于判断是否需要创建新进程,如果满足下面三种情况,就不会创建新进程

//Wedon''thavetodoanythingmoreif:

//(1)Thereisanexistingapplicationrecord;and

//(2)Thecallerdoesn''tthinkitisdead,ORthereisnothread

//objectattachedtoitsoweknowitcouldn''thavecrashed;and

//(3)Thereisapidassignedtoit,soitiseitherstartingor

//alreadyrunning.

...



//继续调用startProcessLocked()真正创建新进程

startProcessLocked(app,hostingType,hostingNameStr,abiOverride,entryPoint,entryPointArgs);

return(app.pid!=0)?app:null;

}



privatefinalvoidstartProcessLocked(ProcessRecordapp,StringhostingType,

StringhostingNameStr,StringabiOverride,StringentryPoint,String[]entryPointArgs)



{

...

try{

//下面代码主要是初始化新进程需要的参数

intuid=app.uid;

int[]gids=null;

intmountExternal=Zygote.MOUNT_EXTERNAL_NONE;

if(!app.isolated){

int[]permGids=null;

try{

finalPackageManagerpm=mContext.getPackageManager();

permGids=pm.getPackageGids(app.info.packageName);



...

}catch(PackageManager.NameNotFoundExceptione){

}

if(permGids==null){

gids=newint[2];

}else{

gids=newint[permGids.length+2];

System.arraycopy(permGids,0,gids,2,permGids.length);

}

gids[0]=UserHandle.getSharedAppGid(UserHandle.getAppId(uid));

gids[1]=UserHandle.getUserGid(UserHandle.getUserId(uid));

}

...



app.gids=gids;

app.requiredAbi=requiredAbi;

app.instructionSet=instructionSet;



//是否是Activity所在的进程,此处entryPoint为null所以isActivityProcess为true

booleanisActivityProcess=(entryPoint==null);

if(entryPoint==null)

entryPoint="android.app.ActivityThread";

/

调用Process.start接口来创建一个新的进程,并会创建一个android.app.ActivityThread类的对象,

并且执行它的main函数,ActivityThread是应用程序的主线程

/

Process.ProcessStartResultstartResult=

Process.start(entryPoint,

app.processName,uid,uid,gids,debugFlags,mountExternal,

app.info.targetSdkVersion,app.info.seinfo,requiredAbi,instructionSet,

app.info.dataDir,entryPointArgs);

...

}catch(RuntimeExceptione){

//创建进程失败

Slog.e(TAG,"Failurestartingprocess"+app.processName,e);

}

}

在第二个startProcessLocked()方法中主要进行一些判断,判断是否需要创建新进程;紧接着调用无返回值的startProcessLocked()方法,在



这个方法中通过Process.start接口创建出新的进程。我们知道线程是程序执行的最小单元,线程栖息于进程中,每个进程在创建完毕后都会有



一个主线程被开启,在大多数变成语言中线程的入口都是通过main函数,这里也不例外,当进程创建完毕后,进程的主线程就被创建了,并会



调用其main方法,Android中ActivityThread就代表着主线程,接着我们来到ActivityThread:



step13:ActivityThread



publicfinalclassActivityThread{

finalApplicationThreadmAppThread=newApplicationThread();

//新的进程创建后就会执行这个main方法

publicstaticvoidmain(String[]args){

...



Looper.prepareMainLooper();



//创建一个ActivityThread实例,并调用他的attach方法

ActivityThreadthread=newActivityThread();

thread.attach(false);

...



if(false){

Looper.myLooper().setMessageLogging(new

LogPrinter(Log.DEBUG,"ActivityThread"));

}

...

//进入消息循环

Looper.loop();



thrownewRuntimeException("Mainthreadloopunexpectedlyexited");

}



privatevoidattach(booleansystem){

sCurrentActivityThread=this;

mSystemThread=system;

if(!system){

...

/

ActivityManagerNative.getDefault()方法返回的是一个ActivityManagerProxy对象,

ActivityManagerProxy实现了IActivityManager接口,并维护了一个mRemote,

这个mRemote就是ActivityManagerService的远程代理对象

/

finalIActivityManagermgr=ActivityManagerNative.getDefault();

try{

//调用attachApplication(),并将mAppThread传入,mAppThread是ApplicationThread类的示例,他的作用是用来进程间通



信的

mgr.attachApplication(mAppThread);

}catch(RemoteExceptionex){

//Ignore

}

...

}else{

...

}

...

}

}

ActivityThread是应用程序进程中的主线程,他的作用是调度和执行activities、广播和其他操作。main方法开启了消息循环机制,并调用



attach()方法,attach()方法会调用ActivityManagerNative.getDefault()获取到一个ActivityManagerProxy示例,上面step3中我们讲解了



ActivityManagerNative这个类,ActivityManagerProxy中维护了ActivityManagerService的远程代理对象mRemote;然后会调用



attachApplication()方法通过mRemote调用到ActivityManagerService的attachApplication()中,传入的mAppThread是ApplicationThread类



型,mAppThread实际上通过Handler实现ActivityManagerService与ActivityThread的消息通信。



step14:ActivityManagerProxy.attachApplication()(ActivityManagerNative内部类)



publicvoidattachApplication(IApplicationThreadapp)throwsRemoteException

{

Parceldata=Parcel.obtain();

Parcelreply=Parcel.obtain();

data.writeInterfaceToken(IActivityManager.descriptor);

data.writeStrongBinder(app.asBinder());

mRemote.transact(ATTACH_APPLICATION_TRANSACTION,data,reply,0);

reply.readException();

data.recycle();

reply.recycle();

}

attachApplication()接受IApplicationThread实例,step13中attach()方法传入的ApplicationThread实现了IApplicationThread,然后通过



ActivityManagerService的远程代理对象mRemote,进入ActivityManagerService的attachApplication():



step15:ActivityManagerService.attachApplication()



@Override

publicfinalvoidattachApplication(IApplicationThreadthread){

synchronized(this){

intcallingPid=Binder.getCallingPid();

finallongorigId=Binder.clearCallingIdentity();

//接着调用attachAppwww.shanxiwang.netlicationLocked()

attachApplicationLocked(thread,callingPid);

Binder.restoreCallingIdentity(origId);

}

}



privatefinalbooleanattachApplicationLocked(IApplicationThreadthread,

intpid){

//①获取到进程

ProcessRecordapp;

if(pid!=MY_PID&&pid>=0){

synchronized(mPidsSelfLocked){

app=mPidsSelfLocked.get(pid);

}

}else{

app=null;

}

if(app==null){

if(pid>0&&pid!=MY_PID){

...

Process.killProcessQuiet(pid);

}else{

thread.scheduleExit();

...

}

returnfalse;

}

...

//②对app的一些成员变量进行初始化

app.makeActive(thread,mProcessStats);

app.curAdj=app.setAdj=-100;

app.curSchedGroup=app.setSchedGroup=Process.THREAD_GROUP_DEFAULT;

app.forcingToForeground=null;

updateProcessForegroundLocked(app,false,false);

app.hasShownUi=false;

app.debugging=false;

app.cached=false;

app.killedByAm=false;



...

booleannormalMode=mProcessesReady||isAllowedWhileBooting(app.info);

...

booleanbadApp=false;

booleandidSomething=false;



//Seeifthetopvisibleactivityiswaitingtoruninthisprocess...

/

③检查当前进程中顶端的activity是否等着被运行,这个顶端的activity就是我们要启动的activity;



此处适用于需要为activity创建新进程的情况(比如点击Launcher桌面上的图标启动应用,或者打开配置了process的activity)



如果应用程序已经启动,在应用程序内部启动activity(未配置process)不会创建进程,这种情况回到step11中的第①步直接开启



activity

/

if(normalMode){

try{

if(mStackSupervisor.attachApplicationLocked(app)){

didSomething=true;

}

}catch(Exceptione){

Slog.wtf(TAG,"Exceptionthrownlaunchingactivitiesin"+app,e);

badApp=true;

}

}



//Findanyservicesthatshouldberunninginthisprocess...

//④查找当前进程中应该启动的服务,并将其启动

if(!badApp){

try{

didSomething|=mServices.attachApplicationLocked(app,processName);

}catch(Exceptione){

Slog.wtf(TAG,"Exceptionthrownstartingservicesin"+app,e);

badApp=true;

}

}



//Checkifanext-broadcastreceiverisinthisprocess...

//⑤查找当前进程中应该注册的广播

if(!badApp&&isPendingBroadcastProcessLocked(pid)){

try{

didSomething|=sendPendingBroadcastsLocked(app);

}catch(Exceptione){

//Iftheappdiedtryingtolaunchthereceiverwedeclareit''bad''

Slog.wtf(TAG,"Exceptionthrowndispatchingbroadcastsin"+app,e);

badApp=true;

}

}

//Checkwhetherthenextbackupagentisinthisprocess...

...



returntrue;

}

attachApplication()方法调用了attachApplicationLocked()方法,在step12中,我们创建了一个ProcessRecord,这里通过进程的pid将他取



出来,赋值给app,并初始化app的一些成员变量,然后为当前进程启动顶层activity、一些服务和广播;这里我们就不深入研究到底启动的是



那些,我们主要研究activity的启动,所以重点看第③步,_step6_中最后创建了一个ActivityRecord实例r,这个r只是进程堆栈中的一个活



动记录,然后再step8中将这个r插入到堆栈最顶端,所以这个r相当于一个占位,并不是真正启动的Activity,真正启动Activity需要判断进



程是否存在,如果存在就直接启动,如果不存在需要启动进程后再执行此处第③步调用ActivityStackSupervisor.attachApplicationLocked



(ProcessRecord)方法:



step16:ActivityStackSupervisor.attachApplicationLocked(ProcessRecord)



booleanattachApplicationLocked(ProcessRecordapp)throwsRemoteException{

finalStringprocessName=app.processName;

booleandidSomething=false;

for(intdisplayNdx=mActivityDisplays.size()-1;displayNdx>=0;--displayNdx){

ArrayListstacks=mActivityDisplays.valueAt(displayNdx).mStacks;

for(intstackNdx=stacks.size()-1;stackNdx>=0;--stackNdx){

//遍历进程中的堆栈,找到最顶层的堆栈

finalActivityStackstack=stacks.get(stackNdx);

if(!isFrontStack(stack)){

continue;

}

//

/

获取位于顶层堆栈中栈顶的activity,这个activity就是目标activity(需要被启动的);

这个hr就是step6中创建的ActivityRecord实例r

/

ActivityRecordhr=stack.topRunningActivityLocked(null);

if(hr!=null){

if(hr.app==null&&app.uid==hr.info.applicationInfo.uid

&&processName.equals(hr.processName)){

try{

//调用realStartActivityLocked()方法启动activity,同step11中的第①步

if(realStartActivityLocked(hr,app,true,true)){

didSomething=true;

}

}catch(RemoteExceptione){

Slog.w(TAG,"Exceptioninnewapplicationwhenstartingactivity"

+hr.intent.getComponent().flattenToShortString(),e);

throwe;

}

}

}

}

}

if(!didSomething){

ensureActivitiesVisibleLocked(null,0);

}

returndidSomething;

}

这个方法中首先遍历进程中的堆栈,找到位于顶层的堆栈,然后调用topRunningActivityLocked()获取位于栈顶的ActivityRecord记录,最后



调用realStartActivityLocked()方法启动activity:



★★★step17:ActivityStackSupervisor.realStartActivityLocked()



finalbooleanrealStartActivityLocked(ActivityRecordr,

ProcessRecordapp,booleanandResume,booleancheckConfig)

throwsRemoteException{

...



r.app=app;

...



intidx=app.activities.indexOf(r);

if(idx<0){

app.activities.add(r);

}

finalActivityStackstack=r.task.stack;



try{

...

Listresults=null;

ListnewIntents=null;

if(andResume){

results=r.results;

newIntents=r.newIntents;

}

...

//

app.thread.scheduleLaunchActivity(newIntent(r.intent),r.appToken,

System.identityHashCode(r),r.info,newConfiguration(mService.mConfiguration),

r.compat,r.launchedFromPackage,r.task.voiceInteractor,app.repProcState,

r.icicle,r.persistentState,results,newIntents,!andResume,

mService.isNextTransitionForward(),profilerInfo);

...

}catch(RemoteExceptione){

if(r.launchFailed){

//Thisisthesecondtimewefailed--finishactivityandgiveup.

...

returnfalse;

}

//Thisisthefirsttimewefailed--restartprocessandretry.

app.activities.remove(r);

throwe;

}

...



returntrue;

}

这个方法调用app.thread.scheduleLaunchActivity()真正的启动一个activity,这里thread是IApplicationThread的实例,也就是



ActivityThread中的成员变量ApplicationThreadmAppThread;在step15的第②步初始化app时调用app.makeActive(thread,mProcessStats)



为其赋值的。我们接着看看ApplicationThread.scheduleLaunchActivity():



step18:ApplicationThread.scheduleLaunchActivity()



@Override

publicfinalvoidscheduleLaunchActivity(Intentintent,IBindertoken,intident,

ActivityInfoinfo,ConfigurationcurConfig,ConfigurationoverrideConfig,

CompatibilityInfocompatInfo,Stringreferrer,IVoiceInteractorvoiceInteractor,

intprocState,Bundlestate,PersistableBundlepersistentState,

ListpendingResults,ListpendingNewIntents,

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);

}

ActivityThread中有一个H的成员变量,它是一个Handler,专门接受ApplicationThread发送的消息,然后调用ActivityThread中的方法,我



们看看H是怎样处理消息的:



step19:ActivityThread.H



publicfinalclassActivityThread{

...

finalApplicationThreadmAppThread=newApplicationThread();

finalHmH=newH();



privatevoidsendMessage(intwhat,Objectobj){

sendMessage(what,obj,0,0,false);

}

...

privatevoidsendMessage(intwhat,Objectobj,intarg1,intarg2,booleanasync){

if(DEBUG_MESSAGES)Slog.v(

TAG,"SCHEDULE"+what+""+mH.codeToString(what)

+":"+arg1+"/"+obj);

Messagemsg=Message.obtain();

msg.what=what;

msg.obj=obj;

msg.arg1=arg1;

msg.arg2=arg2;

if(async){

msg.setAsynchronous(true);

}

mH.sendMessage(msg);

}



privateclassHextendsHandler{

publicvoidhandleMessage(Messagemsg){

if(DEBUG_MESSAGES)Slog.v(TAG,">>>handling:"+codeToString(msg.what));

switch(msg.what){

caseLAUNCH_ACTIVITY:{//启动activity

...

handleLaunchActivity(r,null);

...

}

break;

caseRELAUNCH_ACTIVITY:{//重新启动activity

...

handleRelaunchActivity(r);

...

}

break;

casePAUSE_ACTIVITY://activity失去焦点

...

handlePauseActivity((IBinder)msg.obj,false,(msg.arg1&1)!=0,msg.arg2,

(msg.arg1&2)!=0);

...

break;

...

caseRESUME_ACTIVITY://activity获取焦点

Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,"activityResume");

handleResumeActivity((IBinder)msg.obj,true,msg.arg1!=0,true);

Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);

break;

...

}

}

}

}

step18中调用sendMessage(H.LAUNCH_ACTIVITY,r)之后,mH会收到一个LAUNCH_ACTIVITY消息,然后调用了



ActivityThread.handleLaunchActivity(r,null):



step20:ActivityThread.handleLaunchActivity(r,null)



privatevoidhandleLaunchActivity(ActivityClientRecordr,IntentcustomIntent){

...

//创建Activity对象,并初始化,然后调用activity.attach()和onCreate()

Activitya=performLaunchActivity(r,customIntent);

if(a!=null){

r.createdConfig=newConfiguration(mConfiguration);

BundleoldState=r.state;

//调用activity.onResume()

handleResumeActivity(r.token,false,r.isForward,

!r.activity.mFinished&&!r.startsNotResumed);



...

}else{

...

}

}

这里首先调用performLaunchActivity()方法创建Activity对象(调用它的attach()和onCreate()方法),然后调用handleResumeActivity函数



来使这个Activity进入Resumed状态,并回调这个Activity的onResume函数。我们接着看看performLaunchActivity()方法中做了什么:



step21:ActivityThread.performLaunchActivity()



privateActivityperformLaunchActivity(ActivityClientRecordr,IntentcustomIntent){

//①收集要启动的Activity的相关信息,主要package和component

ActivityInfoaInfo=r.activityInfo;

...

ComponentNamecomponent=r.intent.getComponent();

...



Activityactivity=null;

try{

//②通过类加载器将activity的类加载进来,然后创建activity对象

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){

...

}



try{

//③创建Application,也就是AndroidManifest.xml配置的

Applicationapp=r.packageInfo.makeApplication(false,mInstrumentation);

...

if(activity!=null){

//④创建Activity的上下文Content,并通过attach方法将这些信息设置到Activity中去

ContextappContext=createBaseContextForActivity(r,activity);

CharSequencetitle=r.activityInfo.loadLabel(appContext.getPackageManager());

Configurationconfig=newConfiguration(mCompatConfiguration);



//⑤调用activity的attach()方法,这个方法的作用主要是为activity初始化一些成员变量

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);



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;

/

⑥通过mInstrumentation调用activity的onCreate()方法,

mInstrumentation的作用是监控Activity与系统的交互操做。

这时候activity的生命周期就开始了

/

if(r.isPersistable()){

mInstrumentation.callActivityOnCreate(activity,r.state,r.persistentState);

}else{

mInstrumentation.callActivityOnCreate(activity,r.state);

}

//下面主要为堆栈中的ActivityClientRecord设置一些数据

...

r.activity=activity;

r.stopped=true;

if(!r.activity.mFinished){

activity.performStart();

r.stopped=false;

}

...

}

r.paused=true;

...

}catch(SuperNotCalledExceptione){

throwe;



}catch(Exceptione){

if(!mInstrumentation.onException(activity,e)){

thrownewRuntimeException(

"Unabletostartactivity"+component

+":"+e.toString(),e);

}

}



returnactivity;

}

performLaunchActivity()中首先根据activity的className加载类文件,并创建activity实例,然后初始化上下文Context,并调用attach()



方法初始化activity,最后通过mInstrumentation回调activity的onCreate()方法,这样Activity算是创建完成了。





??这篇博客涉及到的内容还是比较多,每个过程中主要的代码注释已经标示的比较清楚了,还有些细节问题有兴趣的可以更加深入的去研究,



相信如果弄懂这个流程后,再去深入也不是什么难事了。项目中framwork层的源码都是参照android5.0版本,如果下载源码有问题的同学可以



在本篇博客末尾下载博客研究的工程(主要的源码已经摘录放入到工程中),也可以参考



http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/。



接下来对本篇博客稍作总结:



step1-step3:通过Binder机制将创建activity的消息传给ActivityManagerService



step4-step8:根据activity的启动模式判断activity是否应该重新创建,还是只需要置于栈顶,并将目标activity记录放在栈顶



step9-step10:判断activity是否已经创建,如果已经创建将直接置于resume状态,如果没有创建便重新开启



step11-step12:判断activity所属的进程是否创建,如果没有创建将启动新的进程,如果创建了就直接启动activity



step13-step15:进程的主线程执行ActivityThread的main方法,然后初始化进程相关的东西



step16-step21:实例化栈顶的activity对象,并调用Activity.attach()初始化,回调onCreate()生命周期方法;然后调用



ActivityThread.handleResumeActivity()使activity处于resume状态

献花(0)
+1
(本文系网络学习天...首藏)