startActivity --> ActivityManagerNative.getDefault().startActivity
mRemote.transact(_
startActivity
ActivityManagerNative.getDefault().startActivity// 拿到AMS的binder对象,
//然后调用startActivity
mRemote.transact(START_ACTIVITY_TRANSACTION,data,reply,0);
//将所有的请求参数
//封装parcel里面然后写入到binder驱动。binder驱动转发到AMS
//AMS就能收到onTransact回调,然后onTransact回调就能收到请求参数。
public boolean onTransact(int code,Parcel data,Parcel reply,int flags){
//取出data,然后根据code请求码处理请求
switch(code){
case START_ACTIVITY_TRANSACTION:{
startActivity(app,callingPackage,intent,...);//startActivity
}
}
...
}
AMS处理startActivity
首先经过ActivityStarter.java
mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,
request.voiceInteractor, startFlags, true /* doResume */, checkedOptions, inTask,
restrictedBgActivity, intentGrants);
--->startActivityInner() -->
ActivityStack.java startActivityLocked() -->
void startSpecificActivity(ActivityRecord r,...){
ProcessRecord app = mService.getProcessRecordLocked(r.processName,...);
//查看应用进程真的启动了没有
if(app!=null && app.thread!=null){//当前的ProcessRecord 不为 null ApplicationThread 不是null
realStartActivityLocked(r,app,...);//启动activity
return;
}
mService.startProcessAsync(r.processName,...);
}
启动activity
void startProcessLocked(ProcessRecord app){
if(entryPoint ==null) entryPoint = "android.app.ActivityThread";
//应用进程启动之后入口函数的java类
Process.ProcessStartResult startResult = Process.start(entryPoint,...);
//向zygote发送一个启动进程的请求,回到上entryPoint
synchronized(mPidsSelfLocked){
mPidSelfLocked.put(startResult.pid,app);//pid等信息
Message msg = mHandler.obtainMessage(PROC_START_TIMEOUT_MSG);
msg.obj = app;
//应用进程启动之后没有向AMS报告就会超时,
//超时事件定义是10s,超时就会清理应用相关的信息
mHandler.sendMessageDelayed(msg,PROC_START_TIMEOUT);
}
}
public static final ProcessStartResult start(final String processClass,...){
return startViaZygote(processClass);
}
ProcessStartResult startViaZygote(final String processClass,...){
//1.打开 zygote 的socket
//2.通过socket 发送启动进程参数并且得到返回结果
return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),argsForZygote);
}
//zygote的函数处理
boolean runOnce(){
String[] args = readArgumentList( );//读取参数列表
int pid = Zygote.forkAndSpecialize(...);//创建子进程
if(pid==0){
//初始化,启用binder机制,应用的入口函数ActivityThread.main
handleChildProc(parsedArgs,...);
return true;
}else{
//将子进程的pid通过socket返回给AMS
return handleParentProc(pid,...);
}
}
public static void main(String[] args){
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);//向AMS报告
Looper.loop();
throw new RuntimeException("Main loop exit...")
}
private void attach(boolean system){
IActivityManager mgr - AcitivtyManagerNative.getDefault();
mgr.attachApplication(mAppThread);
}
这个是本人总结的,mkw的framework面试的资料,需要具体的视频和其他的资料,TB店铺 纳新工作室 中找framework 资料就好哈。