Activity管理主要涉及Activity的创建,不同Activity的切换。整个管理流程涉及下面几个类:
Activity的启动是由特殊的Activity——系统launcher来启动的,即我们在launcher选择好我们要启动的apk的图标,launcher会根据AndroidManifest.xml的配置信息选择要引导那个Activity。具体这是由launcher中的startActivity(intent)
来调用。
注意: ActivityThread与AcitivityManagerService的通信是属于进程间通信,使用binder机制;
步骤流程:
1.应用的启动是从其他应用调用startActivity开始的。通过代理请求AMS启动Activity。
2.AMS创建进程,并进入ActivityThread的main入口。在main入口,主线程初始化,并loop起来.主线程初始化,主要是实例化ActivityThread和ApplicationThread,以及MainLooper的创建。ActivityThread和ApplicationThread实例用于与AMS进程通信。
3.应用进程将实例化的ApplicationThread,Binder传递给AMS,这样AMS就可以通过代理对应用进程进行访问
4.AMS通过代理,请求启动Activity。ApplicationThread通知主线程执行该请求。然后,ActivityThread执行Activity的启动。Activity的启动包括,Activity的实例化,Application的实例化,以及Activity的启动流程:create、start、resume。
可以看到入口Activity其实是先于Application实例化,只是onCreate之类的流程,先于Activity的流程。另外需要scheduleLaunchActivity,在ApplicationThreaad中,对应AMS管理Activity生命周期的方法都以scheduleXXXActivity,ApplicationThread在Binder线程中,它会向主线程发送消息,ActivityThread的Handler会调用相应的handleXXXActivity方法,然后会执行performXXXActivity方法,最终调用Activity的onXXX方法。
这个流程比较复杂,需要注意的有几点:
1.Activity获取AMS的远程代理:ActivityManagerNative::getDefault,它返回的是代理ActivityManagerService的ActivityManagerProxy。
2.AMS通过ActivityStack和ActivityStackSupervisor管理Activity栈,实现Activity之间的切换。
3.ActivitStack对应生命周期的方法: xxxActivityLocked。(eg: startActivityLocked)
4.全新启动过程中,AMS只进行了Launch调度,没有进行Start和Resume调度。
这里可以看到,Activity的create、start、resume直接在scheduleLaunch后面全部执行了。
应用的退出,首页由Activity调用自身的finish。
然后AMS调度应用Pause。
应用Pause之后通知AMS。
AMS再调度应用Destroy。应用执行这个请求时,会先Stop,现进行Destroy。
AMS进行Pause和Destroy调度,没有进行Stop调度。
Pause在AMS调度Pause之后完成。 Stop和Destroy在AMS调度Destroy后完成。