框架层理解Activity生命周期
1 生命周期图
2主要类图调用
上面类图关系中包含两个进程,一个是应用程序进程,另一个是AMS进程,所以会涉及到进程间通信,android进程间通信用的是Binder通信。
2.1 客户进程
Ø
可以看到该类有一个main方法,其实它是android一个应用程序的入口,每启动一个应用进程,都会创建ActivityThread与之对应的实例,是应用程序的UI线程,Android进程启动时会建立消息循环。负责管理应用程序的生命周期,执行系统广播及其ActivityManagerService请求执行的操作。属于客户端对象。
Ø
Ø
AMS就是通过该代理与ActivityThread进行通信的。
Ø
Activity是应用程序真正做事情的类,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation。通俗的理解,Instrumentation与ActivityThread的区别,前者像是一个“家庭”里的“管家”,后者是负责创建这个“家庭”,并负责对外打交道,比如接收AMS的通知等。
2.2 AMS进程
Ø
管理Activity的生命周期
Ø
Ø
Ø
Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
Ø
ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord来记录Activity的状态以及其他的管理信息。
Ø
AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。
Ø
一个Apk文件运行时会对应一个进程,ProcessRecord正是记录一个进程中的相关信息。
3startActivity流程
在Android系统中,应用程序是由Activity组成的,因此,应用程序的启动过程实际上就是应用程序中的默认Activity的启动过程。启动Android应用程序中的Activity的两种情景,第一,在android设备屏幕中点击应用程序图标的情景就会引发Android应用程序中的默认Activity的启动,从而把应用程序启动起来,这种启动方式的特点是会启动一个新的进程来加载相应的Activity。第二,应用程序内部启动非默认Activity的过程的源代码,这种非默认Activity一般是在原来的进程和任务中启动的。在Android的Activity管理机制中,当退出Activity的时候,在某些情况下并没有立即把该Activity杀死,而是将其暂时保存起来,当第二次调用startActivity启动该Activity的时候,就不需要再创建该Activity的实例,直接恢复Activity即可。
3.1 调用流程图
对用户来讲,启动一个Activity有以下几种方式:
Ø
Ø
Ø
Ø
对于AMS内部讲,启动一个Activity有三种方式,如上图中的①②③分支:
①目标Activity的对象已经存在,那么直接resume该Activity
②目标Activity所在的进程不存在,那么需要创建进程,并在新的进程中启动该Activity
③目标Activity所在进程已经存在,那么直接在已存在进程中启动该Activity
3.2 在新的进程中启动
以在Home程序中点击一个应用图标,启动MainActivity为例子,介绍如下。
时序图如下图:
以上时序图包含35步骤调用,下面逐一讲解:
3.2.1 (1~4),Launcher中发送startActivity请求
Instrumentation.execStartActivity:
publicActivityResult execStartActivity( |