APP的启动过程

以下内容整理自互联网,仅用于个人学习


1. APP的启动

APP的启动过程_第1张图片
APP启动过程.png

上图就可以很好的说明App启动的过程

ActivityManagerService组织回退栈时以ActivityRecord为基本单位,所有的ActivityRecord放在同一个ArrayList里,可以将mHistory看作一个栈对象,索引0所指的对象位于栈底,索引mHistory.size()-1所指的对象位于栈顶。

Zygote进程孵化出新的应用进程后,会执行ActivityThread类的main方法.在该方法里会先准备好Looper和消息队列,然后调用attach方法将应用进程绑定到ActivityManagerService,然后进入loop循环,不断地读取消息队列里的消息,并分发消息。

ActivityThread的main方法执行后,应用进程接下来通知ActivityManagerService应用进程已启动,ActivityManagerService保存应用进程的一个代理对象,这样ActivityManagerService可以通过这个代理对象控制应用进程,然后ActivityManagerService通知应用进程创建入口Activity的实例,并执行它的生命周期方法。

2. Activity的启动

调用Activity的startActivity实际是内部是调用了startActivityForResult。而在startActivityForResult内部是调用了Instrumentation的execStartActivity。execStartActivity内部调用AmS的startActivity(Binder机制)。AmS执行startActivity期间先做一些与栈相关的工作(获取要启动Activity相关信息ActivityRecord,栈的创建、检查权限等等)。

AmS的startActivity的调用过程

  • ActivityStackSupervisor.startActivityMayWait(直接调用,没有其他代码):从Intent里解析需要启动的Activity的相关信息。如:包名、类名。相关信息存在ResolveInfo类中,通过该类里面得到ActivityInfo对象。
  • ActivityStackSupervisor.startActivityLocked:通过传入的caller形参(IApplicationThread类型,从Activity的startActivity函数就开始一个个函数调用传入)得到调用者进程相关信息,保存到callerApp(ProcessRecord类型)变量中,然后创建要启动的Activity相关信息。保存到r(ActivityRecord)变量中。
  • ActivityStackSupervisor.startActivityUncheckedLocked:获取Activity的启动模式、判断要启动的Activity是否在栈顶、得到Activity加载的栈。
  • ActivityStack.resumeTopActivitiesLocked:确保被调用的Activity所在的栈处于顶端。
  • ActivityStack.resumeTopActivityInnerLocked:判断要启动的Activity所在的栈是否对当前用户不可见,如果不可见就不需要继续执行下去,因为即使把这个Activity启动起来,用户也看不见,还不如先把它保存起来,等到下次可见的时候再启动。若可见,则继续执行。把要启动的Activity添加到栈顶。
  • ActivityStackSupervisor.startSpecificActivityLocked:主要跟要启动的Activity进程相关。如判断所再进程是否已经运行、判断是否另开进程。如果没有指定新进程,即直接用默认进程,则直接调用realStartActivityLocked。
  • ActivityStackSupervisor.realStartActivityLocked:通过Binder驱动进入到ApplicationThread的scheduleLaunchActivity函数。

做完这些工作,AmS通过Binder调ApplicationThread(是个Binder对象)的scheduleLaunchActivity。 ApplicationThread通过消息机制控制Activity生命周期。

你可能感兴趣的:(APP的启动过程)