zoukankan      html  css  js  c++  java
  • Android应用启动、退出分析

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

    §AMS和应用进程

    §应用启动流程

    §应用退出流程

    §启动、退出消息

    AMS和应用进程

     

     

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

    AMS:ActivityManagerService

    系统级Service

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

    与应用进程的跨进程交互

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

    AMS是一个系统级Service。

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

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

    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进程调用。

     

    启动流程

     

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

    进程层次启动流程


     

    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方法。

    进程层次详细启动流程

     


     

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

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

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

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

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

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

    应用层次详细启动流程


     

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

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

     

    退出流程

     

    进程层次退出流程


     

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

    2. 然后AMS调度应用Pause。

    3. 应用Pause之后通知AMS。

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

    进程层次详细退出流程


     

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

    应用层次详细退出流程


     

    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.app.ActivityThread$H){42deea58} null: 100

    100: LAUNCH_ACTIVITY


     

    无START_ACTIVITY和RESUME_ACTIVITY

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

    退出消息

     


     

    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
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 相关阅读:
    CAShapeLayer
    iOS开发多线程篇—NSOperation基本操作
    OS开发多线程篇—NSOperation简单介绍
    iOS开发多线程篇—GCD的常见用法
    iOS开发多线程篇—GCD的基本使用
    iOS开发多线程篇—线程的状态
    iOS开发多线程篇—线程间的通信
    iOS开发多线程篇—线程安全
    iOS开发多线程篇—创建线程
    iOS开发多线程篇—多线程简单介绍
  • 原文地址:https://www.cnblogs.com/feng9exe/p/5705792.html
Copyright © 2011-2022 走看看