上一篇博客介绍了Application
和ActivityThread
,今天来讲一下Android中最为重要的一个组件,Activity
。
1.基本结构
一个应用程序通常由多个Activity
组成,那么在应用程序中肯定需要一个容器来盛放这些Activity
,必要时通过该容器找到对应的Activity
,并进行相关操作。上一篇文章已经讲过一个应用程序对应一个ActivityThread
,所以自然而然地该容器是ActivityThread
在负责维护,这个容器叫做mActivities
,是一个数组,里面的每一项叫做ActivityRecord
,一个ActivityRecord
对应一个Activity
。以上仅仅是应用级别的管理容器,但是很多场景下,系统需要找到某一个特定的Activity
,并下发相关数据比如事件分发。所以还必须在系统层面再维护一个容器,这个容器存放在Activity Manager Service
,对应的容器叫做mHistory
,对应的每一项叫做HistroyRecord
。
每个Activity
必须依靠在进程中,每个进程对应一个AMS中的ProcessRecord
,通过这个ProcessRecord
可以找到对应的应用的所有Activity
,同时还提供了与Activity
联系的接口IActivityThread
。所以整个Activity
的管理框架如下图所示:
2.Activity
启动过程
在Launch Activity时,AMS将对应的HistoryRecord作为token传递到客服端和客服端的Activity建立联系。在AMS中Activity状态变化时,将通过该联系找到客服端的Activity,从而将消息或者动作传递应用程序面对的接口:xxxActivity。整个Activity
的启动过程大致可以分为以下几个步骤:
- 发起startActivity(intent)
请求
- AMS接收到请求后,创建一个HistroyRecord
对象,并将该对象放到mHistory
数组中
- 调用app.thread.scheduleLaunchActivity()
- AMS创建ActivityRecord
对象,将创建的Activity
放入到ActivityRecord
,再将其放入到mActivities
- 发起Activity
的onCreate()
方法
对应的步骤如下图所示: