Android应用启动、退出分析 AMS和应用进程       启动流程     退出流程     启动、退出消息  

http://www.jianshu.com/p/72059201b10a

§AMS和应用进程

§应用启动流程

§应用退出流程

§启动、退出消息

 

 

应用进程 <- 系统管理 <- AMS

AMS:ActivityManagerService

系统级Service

管理应用进程的生命周期(包括进程的Activity、Service、Broadcast和Provider)

与应用进程的跨进程交互

Android的一个应用就是一个进程,系统对应用的管理是一个专门的Service——ActivityManagerService,简称AMS。

AMS是一个系统级Service。

系统通过它来管理应用进程的生命周期,当然包括应用的Activity、Service等的生命周期。

AMS是一个独立的进程,因此它要管理应用进程,必然要进行跨进程交互。

AMS和应用的跨进程交互

Android应用启动、退出分析
AMS和应用进程
 
 
 
启动流程
 
 
退出流程
 
 
启动、退出消息
 
 

ActivityManagerProxy——AMS的代理,供应用进程调用。

     通过ActivityManagerNative.getDefault()获取

ApplicationThreadProxy——应用进程的代理,供AMS进程调用。

    应用启动时,会将应用进程的代理传递到AMS

跨进程通信,一般都会用到远程代理。这个后面会安排专题来讲。

简单来说,有进程A和进程B,进程B要调用进程A,那么A是Server端,B是Client端。AP是Server端的远程代理,代理AP和Server端拥有相同的调用接口。

进程B要调用进程A的接口f,直接调用代理的接口f,代理通过Binder机制通知进程A,唤起进程A相同接口f的调用。

ActivityManagerProxy是AMS的代理,供应用进程调用。

ApplicationThreadProxy是应用进程的代理,供AMS进程调用。

 

启动流程

 

这里以全新启动为例进行分析。

进程层次启动流程

Android应用启动、退出分析
AMS和应用进程
 
 
 
启动流程
 
 
退出流程
 
 
启动、退出消息
 
 

1. 应用的启动是从其他应用调用startActivity开始的。通过代理请求AMS启动Activity。

2. AMS创建进程,并进入ActivityThread的main入口。在main入口,主线程初始化,并loop起来。

主线程初始化,主要是实例化ActivityThread和ApplicationThread,以及MainLooper的创建。ActivityThread和ApplicationThread实例用于与AMS进程通信。

3. 应用进程将实例化的ApplicationThread

Binder传递给AMS,这样AMS就可以通过代理对应用进程进行访问。

4. AMS通过代理,请求启动Activity。ApplicationThread通知主线程执行该请求。然后,ActivityThread执行Activity的启动。

Activity的启动包括,Activity的实例化,Application的实例化,以及Activity的启动流程:create、start、resume。

可以看到入口Activity其实是先于Application实例化,只是onCreate之类的流程,先于Activity的流程。

另外需要scheduleLaunchActivity,在ApplicationThreaad中,对应AMS管理Activity生命周期的方法都以scheduleXXXActivity,ApplicationThread在Binder线程中,它会向主线程发送消息,ActivityThread的Handler会调用相应的handleXXXActivity方法,然后会执行performXXXActivity方法,最终调用Activity的onXXX方法。

进程层次详细启动流程

 

Android应用启动、退出分析
AMS和应用进程
 
 
 
启动流程
 
 
退出流程
 
 
启动、退出消息
 
 

进程层次,主要是应用进程启动和主线程启动流程。

这个流程比较复杂,需要注意的有几点:

1.Activity获取AMS的远程代理:ActivityManagerNative::getDefault,它返回的是代理ActivityManagerService的ActivityManagerProxy。

2.AMS通过ActivityStack和ActivityStackSupervisor管理Activity栈,实现Activity之间的切换。

3.ActivitStack对应生命周期的方法: xxxActivityLocked。(eg: startActivityLocked)

4.全新启动过程中,AMS只进行了Launch调度,没有进行Start和Resume调度。

应用层次详细启动流程

Android应用启动、退出分析
AMS和应用进程
 
 
 
启动流程
 
 
退出流程
 
 
启动、退出消息
 
 

应用层次,主要是Activity的启动流程。

这里可以看到,Activity的create、start、resume直接在scheduleLaunch后面全部执行了。

 

退出流程

 

进程层次退出流程

Android应用启动、退出分析
AMS和应用进程
 
 
 
启动流程
 
 
退出流程
 
 
启动、退出消息
 
 

1. 应用的退出,首页由Activity调用自身的finish。

2. 然后AMS调度应用Pause。

3. 应用Pause之后通知AMS。

4. AMS再调度应用Destroy。应用执行这个请求时,会先Stop,现进行Destroy。

进程层次详细退出流程

Android应用启动、退出分析
AMS和应用进程
 
 
 
启动流程
 
 
退出流程
 
 
启动、退出消息
 
 

可以看到,AMS进行Pause和Destroy调度,没有进行Stop调度。

应用层次详细退出流程

Android应用启动、退出分析
AMS和应用进程
 
 
 
启动流程
 
 
退出流程
 
 
启动、退出消息
 
 

Pause在AMS调度Pause之后完成。

Stop和Destroy在AMS调度Destroy后完成。

 

启动、退出消息

 

打印MainLooper消息

在Activity类加入静态代码块

  static {

  Looper.myLooper().setMessageLogging(newLogPrinter(Log.INFO, TAG));

  }

MainLooper对应的Handler

−ActivityThread$H

−ViewRootImpl$ViewRootHandler

−…

上次已经讲过了,Activity的实例化是在主线程,因此Looper.myLooper()拿到的是MainLooper。设置MessageLogging,这样MainLooper的消息就可打印出来。

MainLooper对应的Handler比较多,与启动过程相关的是ActivityThread$H。

启动消息

Android应用启动、退出分析
AMS和应用进程
 
 
 
启动流程
 
 
退出流程
 
 
启动、退出消息
 
 

全新启动时,主线程基本消息就是这些。

(android.app.ActivityThread$H){42deea58} null: 100

100: LAUNCH_ACTIVITY

Android应用启动、退出分析
AMS和应用进程
 
 
 
启动流程
 
 
退出流程
 
 
启动、退出消息
 
 

无START_ACTIVITY和RESUME_ACTIVITY

可以看到AcitivyThread的H只收到一个LAUNCH的消息。

退出消息

 

Android应用启动、退出分析
AMS和应用进程
 
 
 
启动流程
 
 
退出流程
 
 
启动、退出消息
 
 

Dispatching to Handler (android.app.ActivityThread$H) {42de80b0} null: 102

§102:PAUSE_ACTIVITY_FINISHING

Dispatching to Handler (android.app.ActivityThread$H) {42de80b0} null: 109

§109:DESTROY_ACTIVITY



文/kkmoving(简书作者)
原文链接:http://www.jianshu.com/p/72059201b10a
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。