1,startActivity的通信简图
进入到ATMS的startActivity的时候会去判断要去启动的activity所在所在的进程是否存在
ActivityState.java中的startActivityInner方法中mRootWindowCoontaier.resumeFocusedStackesTopActivities(mTargetStack, mStartActivity, mOptions)
mTargetStack.resumeTopActivityUnCheckedLocked(traget, tragetOptions)
mStartSupervisor.startSpecificActivity(next, true, false)
startSpecificActivity这个方法中回去判断进程是否存在
进程存在:realStartActivityLocked
进程不存在:mService.startProcessAsync用Socket通知Zygote去fork进程,执行AMS的startProcess---> startProcessLocked---> process.processStartResult---process.start---> ZYGOTE_PROCESS.start----> startViaZygote---->zygoteSendArgsAndGetForResult(openZygoteSocketIfNeeded(abi),zygotePolicyFlags,argsForZygote) 在openZygoteSocketIfNeeded方法中创建Socket,两个Socket:attemptConnectToPrimaryZygote和attemptConnectSocketSecondaryZygote,在attemptConnectToPrimaryZygote创建客户端的Socket LocalSocket在调用localSocket.connect(zygoteSocketAdress)最终会去执行realStartActivityLocked
AMS管理新进程
ActivityThread.main ----> thread.attach ----ActivityManager.getService(mgr)拿到AMS ----> mgr.attachApplication(mAppThread, startSeq)通过这个方法把application传给了ams,mAppThread是一个Binder服务
点击了桌面的应用图标最终会调用的Instrumentation的startActivity,Instrumentation会跨进程进入到AMS的startActivity,跨进程通信用的是Binder,AMS在启动Activity的时候会去判断,activity所在的进程是否存在,如果存在直接启动activity,如果不存在,AMS会通过Socket去通知Zygote去fork一个ActivityThread也就是我们activity运行需要的进程,fork出来之后activity会通过attachApplication把applicationThread给到AMS,AMS拿到了applicationThread,通过applicationThreadProxy进入到app所在进程,运行activity的生命周期方法
2,理解startActivity
3,lunch请求AMS的阶段
4,AMS到applicationThread阶段
5,applicationThread到activity