zoukankan      html  css  js  c++  java
  • Activity启动过程全解析

    几个系统关键对象:

    • ActivityManagerServices,简称AMS,服务端对象,负责系统中所有Activity的生命周期
    • ActivityThread,App的真正入口。当开启App之后,会调用main()开始运行,开启消息循环队列,这就是传说中的UI线程或者叫主线程。与ActivityManagerServices配合,一起完成Activity的管理工作
    • ApplicationThread,用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通讯。
    • ApplicationThreadProxy,是ApplicationThread在服务器端的代理,负责和客户端的ApplicationThread通讯。AMS就是通过该代理与ActivityThread进行通信的。
    • Instrumentation,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation来进行具体的操作。
    • ActivityStack,Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
    • ActivityRecord,ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像。
    • TaskRecord,AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。如果你清楚Activity的4种launchMode,那么对这个概念应该不陌生。

     zygote进程通过linux系统中的init进程fork出来,除了第一个zygote进程,其他应用所在的进程都是zygote的子进程,所以每一个App其实都是一个单独的dalvik虚拟机和一个单独的进程。

    SystemServer也是一个进程,而且是由zygote进程fork出来的。系统里面重要的服务都是在这个进程里面开启的,比如 ActivityManagerService、PackageManagerService、WindowManagerService等等

    在ZygoteInit.main()进行初始化 --> startSystemServer -->Zygote.forkSystemServer

    ActivityManagerService,简称AMS,服务端对象,负责系统中所有Activity的生命周期。ActivityManagerService进行初始化的时机很明确,就是在SystemServer进程开启的时候,就会初始化ActivityManagerService

    SystemServer.run()中有四个重要方法

    1.createSystemContext();
    

      创建系统上下文,完成了mSystemContext和ActivityThread的创建

    2.startBootstrapServices()
     初始化ActivityManagerService,初始化PowerManagerService,初始化PowerManager, 初始化DisplayManagerService, 初始化PackageManagerService
    3.startCoreServices()
    4.startOtherServices()

    这是系统进程开启时的流程,在这之后,会开启系统的Launcher程序,完成系统界面的加载与显示.
    我们的App和AMS(SystemServer进程)还有zygote进程分属于三个独立的进程,三者之间的通信方式:

    App与AMS通过Binder进行IPC通信,AMS(SystemServer进程)与zygote通过Socket进行IPC通信。

    注意:

          我们的App通过调用startActivity()并不能直接打开另外一个App,这个方法会通过一系列的调用,最后还是告诉AMS说:“我要打开这个App,我知道他的住址和名字,你帮我打开吧!”

    所以是AMS来通知zygote进程来fork一个新进程,来开启我们的目标App的。

    Instrumentation类里面的方法大多数和Application和Activity有关,这个类就是完成对Application和Activity初始化和生命周期的工具类。每个Activity都持有Instrumentation对象的一个引用,但是整个进程只会存在一个Instrumentation对象。

    AMS是董事会,负责指挥和调度的

    ActivityThread是老板,虽然说家里的事自己说了算,但是需要听从AMS的指挥

    而Instrumentation则是老板娘,负责家里的大事小事,但是一般不抛头露面,听一家之主ActivityThread的安排。

    小tips: startActivityForResult(intent,RESULT_OK)相当于startActivity(),是没有返回结果的


    App进程和system_server进程通信

    效果图

    在 App 进程侧,App 进程作为Binder的客户端当发起启动 Activity 时,通过作为服务端的代理对象的 ActivityManagerProxy 来发起远程调用,此时 system 进程作为服务端,ActivityManagerNative 作为 Binder 本地对象收到远程调用后,由它的实现

    类 ActivityManagerService 完成相应的生命周期管理以及任务栈管理后,会把控制权交给App进程,让App进程完成Activity类对象的创建,以及生命周期回调

    接下来的调用 system 进程作为客户端,App 进程作为服务端,通过system进程作为服务端的代理对象的 ApplicationThreadProxy 发起调用,

    ApplicationThread 作为服务端的 Binder 本地对象收到远程调用后,通过 Handler发送消息由 ActivityThread 进程处理。

     
  • 相关阅读:
    浅谈js 构造函数 以及 new 运算符
    zabbix学习(一)——LNMP环境搭建及zabbix安装
    K8s部署使用CFSSL创建证书
    kubernetes环境搭建 -k8s笔记(一)
    windows下python3和python2虚拟环境配置
    QEMU/KVM网络模式(二)——NAT
    KVM安装
    QEMU网络模式(一)——bridge
    百度地图、腾讯地图、高德地图经纬度转换
    DOS入门(2)
  • 原文地址:https://www.cnblogs.com/krislight1105/p/10133187.html
Copyright © 2011-2022 走看看