安卓应用程序框架研究(一):Activity组件的启动过程

来源:互联网 发布:淘宝电子书商城 编辑:程序博客网 时间:2024/05/16 08:28

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启动起来


总结:从上面三个启动方式来看,一个Activity组件是在已存在的进程中启动还是创建新的进程中启动是由两个因素决定的:第一个因素是这个Activity组件的用户ID,即PackageManagerService分配给它所属的Android应用程序的用户ID;第二个因素是这个Activity组件的android:process属性。从这里可以看出,一个Android应用程序是可以对应于多个应用程序进程的。

参考博客:http://blog.csdn.net/luoshengyang/article/details/6689748

参考书籍:《Android系统源代码情景分析》--罗升阳

0 0
原创粉丝点击