Android中Activity的启动

138 阅读1分钟

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的生命周期方法

image.png

image.png

2,理解startActivity

image.png

3,lunch请求AMS的阶段

image.png

4,AMS到applicationThread阶段

image.png

5,applicationThread到activity

image.png