源码方法
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. ActivityStackSupervisor和ActivityStack:这里会判断进程是否存在和一些生命周期的方法
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的启动操作了。
Instrumentation: 监控应用与系统相关的交互行为。
AMS:组件管理调度中心,什么都不干,但是什么都管。
ActivityStarter:处理Activity什么时候启动,怎么样启动相关问题,也就是处理Intent与Flag相关问题,平时提到的启动模式都可以在这里找到实现。
ActivityStackSupervisior:这个类的作用你从它的名字就可以看出来,它用来管理Stack和Task。
ActivityStack:用来管理栈里的Activity。
ActivityThread:最终干活的人,是ActivityThread的内部类,Activity、Service、BroadcastReceiver的启动、切换、调度等各种操作都在这个类里完成。
网友评论