框架层理解Activity生命周期

框架层理解Activity生命周期

1 生命周期图


2主要类图调用



上面类图关系中包含两个进程,一个是应用程序进程,另一个是AMS进程,所以会涉及到进程间通信,android进程间通信用的是Binder通信。

2.1 客户进程

Ø        ActivityThread

可以看到该类有一个main方法,其实它是android一个应用程序的入口,每启动一个应用进程,都会创建ActivityThread与之对应的实例,是应用程序的UI线程,Android进程启动时会建立消息循环。负责管理应用程序的生命周期,执行系统广播及其ActivityManagerService请求执行的操作。属于客户端对象。

Ø        ApplicationThread&ApplicatinThreadNative

   ApplicationThread用来实现ActivityManagerServiceActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时,通过ApplicationThreadActivityThread通讯,ApplicationThreadNativeApplicationThread在客户端的实现。

Ø        ApplicationThreadProxy

   ApplicationThreadProxyApplicationThread在服务器端的代理。负责和服务器端的ApplicatingThreadNative通讯。

AMS就是通过该代理与ActivityThread进行通信的。

Ø        Activity& Intrumentation

Activity是应用程序真正做事情的类,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation。通俗的理解,InstrumentationActivityThread的区别,前者像是一个“家庭”里的“管家”,后者是负责创建这个“家庭”,并负责对外打交道,比如接收AMS的通知等。

2.2 AMS进程

    这里说的AMS进程,实际指的是System_server进程,System_server进程起来的时候启动AMS服务,AMS实际是ActivityManagerService的缩写。

Ø        ActivityManagerService

管理Activity的生命周期

Ø        ActivityManagerNative

   ActivityManagerService在服务器端的实现,客户端的请求调用ActivityManagerProxy后,通过IBinder,最终会在ActivityManagerNative中实现。ActivityManagerNative再通过调用ActivityManagerService的相关功能,以完成客户端请求。

Ø        ActivityManagerProxy

   ActivityManagerService的在客户端的代理。负责和服务器端的ActivityManagerNative通讯。

Ø        ActivityStack

ActivityAMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。

Ø        ActivityRecord

ActivityStack的管理对象,每个ActivityAMS对应一个ActivityRecord来记录Activity的状态以及其他的管理信息。

Ø        TaskRecord

AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecordAMSTaskRecord确保Activity启动和退出的顺序。

Ø        ProcessRecord

一个Apk文件运行时会对应一个进程,ProcessRecord正是记录一个进程中的相关信息。

3startActivity流程

Android系统中,应用程序是由Activity组成的,因此,应用程序的启动过程实际上就是应用程序中的默认Activity的启动过程。启动Android应用程序中的Activity的两种情景,第一,在android设备屏幕中点击应用程序图标的情景就会引发Android应用程序中的默认Activity的启动,从而把应用程序启动起来,这种启动方式的特点是会启动一个新的进程来加载相应的Activity。第二,应用程序内部启动非默认Activity的过程的源代码,这种非默认Activity一般是在原来的进程和任务中启动的。在AndroidActivity管理机制中,当退出Activity的时候,在某些情况下并没有立即把该Activity杀死,而是将其暂时保存起来,当第二次调用startActivity启动该Activity的时候,就不需要再创建该Activity的实例,直接恢复Activity即可。

3.1 调用流程图



对用户来讲,启动一个Activity有以下几种方式:

Ø        在应用程序中调用startActivity()启动指定的Activity

Ø        Home程序中点击一个应用图标,启动新的Activity

Ø        按“Back”键,结束当前Activity,自动启动上一个Activity

Ø        长按“Home”键,显示当前列表中,从中选则一个启动

对于AMS内部讲,启动一个Activity有三种方式,如上图中的①②③分支:

①目标Activity的对象已经存在,那么直接resumeActivity

②目标Activity所在的进程不存在,那么需要创建进程,并在新的进程中启动该Activity

③目标Activity所在进程已经存在,那么直接在已存在进程中启动该Activity

3.2 在新的进程中启动

以在Home程序中点击一个应用图标,启动MainActivity为例子,介绍如下。

时序图如下图:

框架层理解Activity生命周期

以上时序图包含35步骤调用,下面逐一讲解:

3.2.1 (1~4)Launcher中发送startActivity请求

   Android系统中,应用程序是由Launcher启动起来的,其实,Launcher本身也是一个应用程序,其它的应用程序安装后,就会Launcher的界面上出现一个相应的图标,点击这个图标时,Launcher就会对应的应用程序启动起来。

   Launcher继承与ActivityActivity类的有个成员变量mInstrumentation是,它的类型是Intrumentation,它用来监控应用程序和系统的交互。 


Instrumentation.execStartActivity

publicActivityResult execStartActivity(

           Context who, IBinder contextThread, IBinder token, Activitytarget,

           Intent intent, int requestCode, Bundle options) {

       IApplicationThread whoThread = (IApplicationThread)contextThread;

       ……

       try {

     

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值