系统源码启动activity也是像我们startActivity一样,最终都是执行startActivityfoRresult()只不过startactivity传的是-1,startActforResult()内部核心就是Instrumentation.execStartAct(),instrumentation这个类是在ActivityThread实例化的,ActivityThread接收到AMS的通知将activity启动委托给了instrumentation,instrumentation负责每个act生命周期管控,同时也将ApplicationThread对象作为参数传递给instrumentation,ApplicationThread是ActivityThread的内部类,他就是Binder对象,用来与服务端AMS交互,instumentation最终会调用ams的startAct方法,这是一次跨进程通信,AMS会校验进程是否存在,如果是点击桌面启动的方式进程就需要创建新的进程,向zygote进程发送创建进程的请求fork出APP进程,如果是应用内部Activity则不需要,当ams校验完合法性和启动准备工作后通过ApplicationThread回调到我们的应用进程,又是一次跨进程通信,回调逻辑是在binder线程池中所以需要通过handler H将线程切换到UI线程中,handler发送LauncherActivity消息后ActivityThread 调用Instrumentation.newActivity方法通过反射找到对应的classLoader并开始创建contextImpl执行onattach,onCreate过程,接着在onresume 中将内容渲染绘制到window上显示出来。
参考:
[启动流程]((6条消息) 【Android】一张图看懂Activity的启动流程_风吹起如花般细碎流年-CSDN博客
)
[启动流程]((6条消息) android 面试Activity启动流程_北京流年-CSDN博客_activity启动流程面试
)
网友评论