Android System技术之Activity启动流程分析
相关类介绍:
Instrumentation:
用于实现应用程序测试代码的基类。当在打开仪器的情况下运行时,这个类将在任何应用程序代码之前为您实例化,允许您监视系统与应用程序的所有交互。可以通过AndroidManifest.xml的标签描述该类的实现。
ActivityManager:
该类提供与Activity、Service和Process相关的信息以及交互方法,可以被看作是ActivityManagerService的辅助类。
ActivityManagerService:
Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用程序的管理和调度等工作。
ActivityThread:
管理应用程序进程中主线程的执行,根据Activity管理者的请求调度和执行activities、broadcasts及其相关的操作。
ActivityStack:
负责单个Activity栈的状态和管理。
ActivityStackSupervisor:
负责所有Activity栈的管理。内部管理了mHomeStack、mFocusedStack和mLastFocusedStack三个Activity栈。其中,mHomeStack管理的是Launcher相关的Activity栈;mFocusedStack管理的是当前显示在前台Activity的Activity栈;mLastFocusedStack管理的是上一次显示在前台Activity的Activity栈。
ClientLifecycleManager:
用来管理多个客户端生命周期执行请求的管理类。
1 Context发起启动Activity请求
2AMS处理Activity启动请求
通过ActivityManager.getService()方法可以获得ActivityManagerService提供的服务,所以直接跳转到ActivityManagerService.startActivity方法。无论以何种模式启动最终都会调用ActivityStackSupervisor.resumeFocusedStackTopActivityLocked方法。在ActivityStack.resumeTopActivityInnerLocked方法中会去判断是否有Activity处于Resume状态,如果有的话会先让这个Activity执行Pausing过程,然后再执行startSpecificActivityLocked方法启动要启动Activity。
3 Activity执行Pause流程
在ActivityStack.resumeTopActivityInnerLocked方法中会去判断是否有Activity处于Resume状态,如果有的话会先让这个Activity执行Pausing过程,然后再执行startSpecificActivityLocked方法启动要启动Activity。
ClientLifecycleManager(CLM) 处理公共流程
当mResumedActivity不为空时,发起onPause流程:
4创建Activity所属的新进程
ActivityStackSupervisor.startSpecificActivityLocked方法,在这个方法中会去根据进程和线程是否存在判断App是否已经启动,如果已经启动,就会调用realStartActivityLocked方法继续处理。如果没有启动则调用ActivityManagerService.startProcessLocked方法创建新的进程处理。
5应用进程启动Activity
在ActivityThread.main方法中对ActivityThread进行了初始化,创建了主线程的Looper对象并调用Looper.loop()方法启动Looper,把自定义Handler类H的对象作为主线程的handler。在ActivityThread.attach方法中,首先会通过ActivityManagerService为这个应用绑定一个Application,然后添加一个垃圾回收观察者,每当系统触发垃圾回收的时候就会在run方法里面去计算应用使用了多少内存,如果超过总量的四分之三就会尝试释放内存。最后,为根View添加config回调接收config变化相关的信息。
Activity创建过程:onCreate
Activity启动过程:onCreate -> onResume
6Activity执行Stop过程
在ActivityThread.handleResumeActivity方法里面有这么一行不起眼的代码,当MessageQueue空闲的时候就会执行这个Handler。当MessageQueue空闲的时候就会回调Idler.queueIdle方法,经过层层调用跳转到ActivityStack.stopActivityLocked方法。
在ActivityStack.stopActivityLocked方法中,会执行公共流程ClientLifecycleManager.scheduleTransaction方法,最后会去执行StopActivityItem.execute方法,然后经过多次跳转,最终执行了Activity.onStop方法。