概述
知识梳理系列之八——Activity的启动过程
- 总结
- 流程总结
- 时序图
总结
在应用内,某Activity A通过调用startActivity(Intent)方法启动Activity B的过程:
流程总结
- 调用startActivityForResult,使用Instrumentation调用execStartActivity,其中会传入Context、Intent、ActivityThread.mApplicationThread等引用;
- execStartActivity方法中通过Binder机制调用ActivityTaskManagerService的startActivity方法(在ActivityTaskManager中初始化了静态变量IActivityTaskManager,IActivityTaskManager即为ActivityTaskManagerService的远程代理);
- ActivityTaskManagerService.startActivity方法调用startActivityAsUser,传入userId等,经过重载的startActivityAsUser,使用getActivityStartController.obtaionStarter创建了ActivityStarter类的实例,并执行器execute方法;
- 进入ActivityStarter.execute,Request.mayWait为true(在上一步创建ActivityStarter实例时调用setMayWait设置的),执行startActivityMayWait方法;
- 经过多个startActivity重载方法的调用,触发startActivityUncheck,在方法中执行一个重要方法:RootActivityContainer.resumeFocusedStackTopActivityLocked;
- resumeFocusedStackTopActivityLocked这个方法主要做两件事,首先获取先前焦点Stack的ResumeActivity,并对其执行startPausingLocked方法;然后根据需要被启动的Activity所在进程是否启动,来决定是直接Resume还是触发ActivityStackSupervisor.startSpecificActivityLocked;
- 其中startPausingLocked方法会通过ATMS的LifecycleManager执行scheduleTransaction方法,进而执行PauseActivityItem.execute,执行ActivityThread的handlePauseActivity、performPauseActivity,并且在此执行被Pause的Activity的onSaveInstanceState onPause;
- startSpecificActivityLocked根据目标进程是否启动分别执行realStartActivityLocked方法或启动进程方法;
- realStartActivityLocked则会执行scheduleTransaction方法,此时执行的是LaunchActivityItem、ResumeActivityItem的preExecute、execute、postExecute方法;
- startPausingLocked和realStartActivityLock两个方法都是使用ClientTransaction来处理生命周期,都遵循
ClientLifecycleManager.scheduleTransaction --> ClientTransaction.schedule --> ApplicationThread.scheduleTransaction --> ActivityThread.scheduleTransaction --> ClientTransactionHandler.scheduleTransaction --> 向ActivityThread.H发送消息:EXECUTE_TRANSACTION --> TransactionExecutor.execute --> ClientTransactionItem的preExe、cycleToPath、execute、postExe 的执行过程
其中onPause的ClientTransactionItem是其子类PauseActivityItem;
onCreate的ClientTransactionItem是其子类LaunchActivityItem;
onResume的ClientTransactionItem是其子类ResumeActivityItem;
那么onStart啥时候执行的呢??
秘密藏在cycleToPath方法里,按照生命周期,起始状态是ON_CREATE,目标状态是ON_RESUME,过程中需要ON_START,这个在TransactionExecutor的performLifecycleSequence方法会按照需要调起生命周期的handle方法,触发他的正是cycleToPath,而起始、目标的设置是由ClientTransaction的addCallback、setLifecycleStateRequst来设置的!!!
- LaunchActivityItem的execute方法触发了handleLaunchActivity、performLaunchActivity,其中performLaunchActivity中做了创建ContextImpl、使用Instrumentation.newActivity创建Activity实例、调用Activity.attach(此方法中创建了PhoneWindow)、使用Instrumentation触发Activity的onCreate方法;
- ResumeActivityItem的execute方法触发了handleResumeActivity、performResumeActivity,最后触发activity的performResume和onResume;
- 此时,前一个Activity onSaveInstanceState、onPause了,新Activity onCreate、onStart、onResume了!!!
时序图
文字看起来比较费劲,那么看看时序图:
在来一张关于ActivityThread.H中的消息是怎么来的的图片:
这张图描述了诸如handlePause、handleLaunch、handleResume、performXXX的过程
参考文章:
Activity启动流程总结-生命周期
最后
以上就是无辜身影为你收集整理的知识梳理系列之八——Activity的启动过程总结的全部内容,希望文章能够帮你解决知识梳理系列之八——Activity的启动过程总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复