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方法。

results matching ""

    No results matching ""