
Launcher启动
SystemServer.main
SystemServer组件是由Zygote进程负责启动的,初始化系统服务
PackageManagerService.main
启动PMS,launcher需要从PMS中取所有安装的应用信息
ActivityManagerService.setSystemProcess
调用mSystemThread.installSystemApplicationInfo函数来把应用程序框架层以下的android包载入进
ActivityManagerService.systemReady
ActivityStack.resumeTopActivityLocked
调用ActivityManagerService.startHomeActivityLocked(),启动launcher。当时是发送CATEGORY_HOME类型的intent,具体启动哪个launcher应用,由系统设置决定

普通Activity启动
1,startActivity
Activity.startActivity //通过Activity类来拉起自己
Instrumentation.execStartActivity //由Instrumentation中转
ActivityManager.getService().startActivity //交给AMS的Proxy
ActivityManagerProxy.startActivity //和AMS进行binder通信
2,AMS处理当前栈顶Activity
ActivityManagerService.startActivity
ActivityStack.startActivityLocked //这里影响的是当前栈顶的Activity
ApplicationThreadProxy.schedulePauseActivity //Pause掉当前栈顶的Activity,会产生生命周期变化
3,当前栈顶Activity被干掉
ApplicationThread.schedulePauseActivity
ApplicationThread并不是应用的线程,它是一个binder,最主要的工作就是和AMS交互。
4,AMS要开始目标Activity的处理了
ActivityManagerService.activityPaused //收到之前栈顶Activity已经Pause的通知
//首先AMS会检查目标Activity进程是否存在,如果存在就通知该进程启动目标Activity,不存在则新建进程
ActivityManagerService.startProcessLocked
Process.start //从Zygote fork进程
5,目标Activity进程启动
ActivityThread.main //启动主线程的main函数
6,AMS绑定目标进程
ActivityManagerService.attachApplication
ActivityStack.realStartActivityLocked //Task栈真正去启动Activity。Activity配置的启动模式会产生影响
7,目标Activity开始干活
ApplicationThread.scheduleLaunchActivity
ActivityThread.queueOrSendMessage
H.handleMessage //我们主线程的Handler开始干活了!
ActivityThread.handleLaunchActivity
Instrumentation.newActivity //从第一部就露过脸的大佬终于又出现了,一个Application进程有一个Instrumentation来管理所有Activity的生命周期
Instrumentation.callActivityOnCreate
Activity.onCreate //熟悉的生命周期终于来了!目标Activity终于启动了
网友评论