Activity是Android应用程序的四大组件之一,负责管理Android应用程序的用户界面。一个应用程序一般会包含若干个Activity组件,每个Activity组件负责一个用户界面的展现,它们可能运行在同一个进程中,也可能允许在不同的进程中。运行至不同进程中的Activity组件通过Binder进程间通信机制来协作完成应用程序的功能。
Activity组件的启动方式分为显示和隐示两种。对于显示启动的Activity组件来说,我们必须事先知道用来实现它们的类的名称;对于隐示启动的Activity组件来说,我们只需要知道它们的组件名称即可。隐示启动Activity组件可以减少Android应用程序组件间的依赖。
根Activity组件的启动过程:
由于根Activity组件代表了一个Android应用程序,因此,它一般是在一个新的进程中启动起来的。
在Android系统中,所有的Activity组件都保存在一个堆栈中,其中,后面启动的Activity组件位于前面启动的Activity组件的上面。用户在执行一个操作时,通常需要与一系列相关的Activity组件进行交互,这些相关的Activity组件在系统的Activity堆栈中用一个任务(Task)来描述。
系统的Activity组件堆栈有TasksRecord#2和TasksRecord#3 两个任务,其中,TasksRecord#2包含了一个Lancher组件,表示我们打开了应用程序Launcher.而任务TasksRecord#3包含了一个MainActivity组件,表示我们打开了应用程序Activity。
MainActivity组件是有Launcher组件来启动的,而Launcher组件又是通过Activity管理服务ActivityManagerService来启动MainActivity组件的。由于MainActivity组件,Launcher组件和ActivityManagerService是分别运行在不同的进程中的。因此MainActivity组件的启动过程就涉及到了三个进程。这三个进程是通过Binder进程间通信机制来完成MainActivty组件的启动过程。
Launcher组件启动MainActivity组件的过程如下:
1.Launcher组件向ActivityManagerService发送一个启动MainActivty组件的进程间通信请求。
2.ActivityManagerService首先将要启动的MainActivity组件的信息保存下来,然后再向Launcher组件发送一个进入终止状态的进程间通信请求。
3.Launcher组件进入到中止状态后,向ActivityManagerService发送一个已进入中止状态的进程间通信请求。
4.ActivityManagerService发现用来运行MainActivity组件的应用程序不存在,就会启动一个新的应用程序进程。
5.新的应用程序进程启动完成后,就会向ActivityManagerService发生一个启动完成的进程间通信请求。
6.ActivityManagerService将第二步保存下来的MainActivity组件的信息发送给第4步创建的应用程序进程,以便它可以将MainActivity组件启动起来。