Activity是安卓四大基本组件之一,从应用程序的角度出发,Activity可以分为两种:根Activity和子Activity。根Activity以桌面图标形式显示在应用程序启动器中,它的启动就代表了一个应用程序的启动。子Activity由根Activity或者其他子Activity启动,它们有可能与启动它们的Activity运行在同一个进程中,也有可能运行在不同的进程中,这取决于它们的配置和启动参数。
Activity组件的启动方式分为显示和隐式两种。显示通过传递类名来启动,隐式通过组件名启动。在这里,我将通过逐步分析根Activity的启动过程和子Activity在进程内和进程外的启动过程。
在Android系统中,所有的Activity组件都保存在一个堆栈中,其中,后面启动的Activity组件位于前面启动的Activity组件上面。用户在执行一个操作时,通常需要与一系列相关的Activity组件进行交互,这些相关的Activity组件在系统的Activity堆栈中用一个任务(Task)来描述。
一、根Activity的启动
根Activity是由Launcher组件来启动的,而Launcher组件又是通过根Activity管理服务ActivityManagerService来启动Activity的。ActivityManagerService在启动根Activity组件时会先创建一个应用程序进程,然后再将里面的Activity启动起来。此时,由于根Activity组件、Launcher组件和ActivityManagerService是分别运行在不同的进程中的,因此,此时根Activity的启动就涉及到了三个进程。这三个进程是通过Binder进程间通信机制来完成根Activity的启动过程的。
Launcher组件启动 根Activity 组件的过程如下:
(1)Launcher组件向AcitivityManagerService发送一个启动根Activity组件的Binder进程间通信请求。
(2)ActivityManagerService将需要启动的根Activity信息保存下来,然后通过Binder进程间通信机制通知Launcher进入Paused状态。
(3)Launcher通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态,于是ActivityManagerService就创建一个新的进程,用来启动一个ActivityThread实例,即将要启动的Activity就是在这个ActivityThread实例中运行。
(4)ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信。
(5)ActivityManagerService通过Binder进程间通信机制将 保存的根Activity的信息通知给ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动操作了。
注:ActivityManagerService是一个系统关键服务,它运行在系统进程System中,负责启动和调度应用程序组件。
二、子Activity组件在进程内的启动过程
在进程内启动的子Activity组件和启动它的Activity组件是运行在同一个应用程序进程中的。
Activity组件在进程内启动 子Activity组件的过程如下:
(1)Activity组件向ActivityManagerService发送一个启动子Activity组件的Binder进程间通信请求。
(2)ActivityManagerService将需要启动的子Activity信息保存下来,然后通过Binder进程间通信机制通知Activity进入Paused状态。
(3)Activity通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态,于是ActivityManagerService开始扫描运行子Ativity的ActivityThread,发现已存在,就继续执行,不创建新的进程。
(4)ActivityManagerService通过Binder进程间通信机制将 保存的子Activity的信息通知给ActivityThread,可以将子Activity启动起来。
三、子Activity组件在进程外的启动过程
在进程外启动的子Activity组件和启动它的Activity组件不是运行在同一个应用程序进程中的。
我们可以为一个Activity声明不同的<android:process>属性来让它在新的进程中启动。
Activity组件在进程外启动 子Activity组件的过程如下:
(1)Activity组件向ActivityManagerService发送一个启动子Activity组件的Binder进程间通信请求。
(2)ActivityManagerService先将需要启动的子Activity信息保存下来,然后通过Binder进程间通信机制通知Activity进入Paused状态。
(3)Activity通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态,于是ActivityManagerService开始扫描运行子Ativity的ActivityThread,发现不存在该进程,于是ActivityManagerService就创建一个新的进程。
(4)ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService
(5)ActivityManagerService通过Binder进程间通信机制将 保存的子Activity的信息通知给ActivityThread,以便可以将子Activity启动起来。
参考博客:http://blog.csdn.net/luoshengyang/article/details/6689748
参考书籍:《Android系统源代码情景分析》--罗升阳