天天看点

Activity启动流程中AMS的具体流程

调用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生命周期。