Activity启动过程(startActivity)的源代码分析

源码方法

1. 从Activity本地调用startActivity()--> Activity#startActivityForResult()

2. Instrumentation#execStartActivity:Instrumentation类相当于一个管家,它的职责是管理各个应用程序和系统的交互,Activity都有此对象的实际引用,可以通过它监测系统与应用程序之间的所有交互。

3.ActivityManagerProxy#startActivity():发起了一次跨进程调用,ActivityManagerService是ActivityManagerNative的具体实现。

4.ActivityStarter():主要负责处理Activity的Intent和Flags, 还有关联相关的Stack和TaskRecord。

ActivityStack.startActivityMayWait():获取Activity的启动信息,包括ResolveInfo和ActivityInfo,以及获取CallingPid和CallingUid;

ActivityStack.startActivityLocked():创建一个ActivityRecord;

ActivityStack.startActivityUnchecked():设置TaskRecord, 完成后执行ActivityStackSupervisor类的resumeFocusedStackTopActivityLocked方法

5. ActivityStackSupervisorActivityStack:这里会判断进程是否存在和一些生命周期的方法

ActivityStackSupervisor#resumeFocusedStackTopActivityLocked()

  --> ActivityStackSupervisor#resumeTopActivityUncheckedLocked():

    --> ActivityStack#resumeTopActivityInnerLocked()

      --> ActivityStackSupervisor#startSpecificActivityLocked()

6:ApplicationThread:IApplicationThread的直接实现,发起了一次跨进程调用

7:ActivityThread:会调用sendMessage,最后调用到mH.sendMessage(msg);

8:ActivityThread#performLaunchActivity():会收集要启动的Activity的相关信息,主要是package和component信息,然后通过ClassLoader将要启动的Activity类加载出来。最后调用mInstrumentation.callActivityOnCreate()

9:Activity#performStart():Activity的生命周期方法是通过Instrumentation类调用callActivityOnXXX方法最终调用Activity的onCreate等方法,调用时机为ActivityThread#performLaunchActivitiy()方法中。

总结:

一. 应用程序的MainActivity通过Binder进程间通信机制通知ActivityManagerService,它要启动一个新的Activity;

二. ActivityManagerService通过Binder进程间通信机制通知MainActivity进入Paused状态;

三. MainActivity通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态,于是ActivityManagerService就准备要在MainActivity所在的进程和任务中启动新的Activity了;

四. ActivityManagerService通过Binder进程间通信机制通知MainActivity所在的ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动操作了。


Activity启动过程(startActivity)的源代码分析_第1张图片

Instrumentation: 监控应用与系统相关的交互行为。

AMS:组件管理调度中心,什么都不干,但是什么都管。

ActivityStarter:处理Activity什么时候启动,怎么样启动相关问题,也就是处理Intent与Flag相关问题,平时提到的启动模式都可以在这里找到实现。

ActivityStackSupervisior:这个类的作用你从它的名字就可以看出来,它用来管理Stack和Task。

ActivityStack:用来管理栈里的Activity。

ActivityThread:最终干活的人,是ActivityThread的内部类,Activity、Service、BroadcastReceiver的启动、切换、调度等各种操作都在这个类里完成。

你可能感兴趣的:(Activity启动过程(startActivity)的源代码分析)