Activity 启动过程:
startActivity()-> Instrumentation.execStartActivity()-> Binder->ActivityManagerService-> Zygote fork app -> Binder -> ApplicationThread.scheduleLaunchActivity() - > Handler -> ActivityThread.handleLaunchActivity() -> performLauncherActivity -> Instrumentation create Activity -> 设置 application ,创建 ContextImpl,调用 attatch 方法,调用 Instrumentation 的 callActivityOnCreate-> Activity.onCreate()
-> setContentView() -> PhoneWindow.setContentView() -> DecorView . setContentView(); -> handleLaunchActivity()-> handleResumeActivity()-> Instrumentation.callActivityonResume()->Activity.onResume(); -> handleLaunchActivity() -> Activity.makeVisibile() ; -> Activity.makeVisibile()-> WindowManager.addView() - > WindowManagerImpl.addView()->WindowManagerGlobal.addView()-> ViewRootImpl.setView() -> requestLayout -> scheduleTranversals()->Runable->doTranversals()->performTranversales()->measure()->layout()->draw();

涉及到进程间通讯 Binder
涉及到线程间通讯 Handler
涉及到 View 的绘制流程
关键类还有 Window, PhoneWindow ,WindowManager ,WindowManagerImpl, WindowManagerGlobal, ViewRootImpl, DecorView

启动过程

  1. 不论是通过从桌面上点击还是通过 startActivity 都会调用到 startActivitForResult 方法,然后会调用 Instrumentation 的方法, Instrumentation 是应用和系统服务的一个桥梁),Instrumentation 的方法会通过 Binder 方式调用 ActivityManagerService 的 startActivity 方法。同时会把 ApplicationThread 这个 Binder 传入给 ActivityManangerService 。这样 ActivityManangerService 就可以通过 ApplicaitonThread 与 ActivityThread 进行通讯了。
  2. ActivityManagerService 收到了 startActivity ,会向 zygote 进程发送创建进程的请求
  3. Zygote 创建子进程成功,即 app 进程
  4. 然后经过一系列的准备,会通过 Binder 方式调用 ApplicationThread , 通过 Handler 调用 ActivityThread 的 handleLaunchActivity 。在 handleLaunchActivity 中调用 performLaunchActivity 这个方法,在这个方法中会通过 Instumention 使用 classloader 创建 Activity 对象,然后初始化 application ,ContextImpl ,设置主题,调用 attatch 方法,然后通过调用 Instrumentation 来调用 activity 的生命周期方法 onCreate()。 在 ActivityThread 的 handleLaunchActivity 的方法中,在调用 performLaunchActivity以后 会继续调用 handleResumeActivity 方法,该方法会通过 Instrumentation 调用 activity 的生命周期方法 onResume().

显示过程

  1. 在启动过程中,通过 ActivityThread 的 handlerLauncherActivity 方法,会调用到 activity 的生命周期方法 onCreate()。在 onCreate() 中调用 setContentView() 方法,设置布局文件,该方法会调用 getWindow.setContentView() 方法, getWindow() 拿到的是 window 对象,Window 的实现类是 PhoneWindow ,所以调用的是 PhoneWindow 的 setContentView() 方法,在 PhoneWindow 的 setContentView() 中会调用 installDecorView() 方法来创建 DecorView ,然后通过 layoutinflate 的 inflate 方法把布局文件加载到 DecorView 的 ContentView 中,虽然已经把布局添加到了 Decorview ,但是还没有显示出来。
  2. 在启动过程中,handlerLauncherActivity() 方法中,在调用 performLauncherActivity 方法以后,会调用 handleResumeActivity 方法,该方法会调用 activity 的 makeVisible() 方法,使 DecorView 通过 WindowManager 加载到屏幕上显示。那布局怎么绘制出来的呢,看下面。

绘制过程

  1. 在 调用 activity 的 makeVisible() 方法后,把 DecorView 通过 addView 方法添加到了 WindowManager 中,WindowManager 的实现类是 WindowManagerImpl ,WindowManagerImpl 的 addView 方法调用了 WindowManagerGlobal 的 addView 方法,在 WindowManagerGlobal 的 addView 方法中,初始化了 ViewRootImpl 类,并通过 setView 方法把 View 和参数注入,然后调用了 requestLayout 方法, requestLayout 会调用 scheduleTraversal 然后调用一系列方法以后,会调用 measure ,layout ,draw 方法,完成布局的测量,布局和绘画。以上就完成了布局的绘制,这时手机上就显示出来了设置的布局。
    ViewGroup-------------------------------> View
    performMeasure -> measuer -> onMeasure -> measure
    performLayout -> layout -> onLayout -> layout
    performDraw -> draw -> onDraw -> draw

关键类:

  • Instrumentation: 应用程序与系统服务的桥梁。为什么是桥梁呢,首先是 startActivity ,会通过 Instrumentation 的 execStartActivity 方法调用 ActivityManagerService 的方法。然后在 acitivty 的生命周期方法的调用,都是由 Instrumentation 调用的。

Android 启动、绘制、显示过程的更多相关文章

  1. 简单研究Android View绘制三 布局过程

    2015-07-28 17:29:19 这一篇主要看看布局过程 一.布局过程肯定要不可避免的涉及到layout()和onLayout()方法,这两个方法都是定义在View.java中,源码如下: /* ...

  2. Android View绘制和显示原理简介

    现在越来越多的应用开始重视流畅度方面的测试,了解Android应用程序是如何在屏幕上显示的则是基础中的基础,就让我们一起看看小小屏幕中大大的学问.这也是我下篇文章--<Android应用流畅度测 ...

  3. Android UI 绘制过程浅析(五)自定义View

    前言 这已经是Android UI 绘制过程浅析系列文章的第五篇了,不出意外的话也是最后一篇.再次声明一下,这一系列文章,是我在拜读了csdn大牛郭霖的博客文章<带你一步步深入了解View> ...

  4. Android 启动过程简析

    首先我们先来看android构架图: android系统是构建在linux系统上面的. 所以android设备启动经历3个过程. Boot Loader,Linux Kernel & Andr ...

  5. Android系统在新进程中启动自定义服务过程(startService)的原理分析

    在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验.Android系统为我们提供了一个Service类,我们可以实现 ...

  6. Android 核心分析 之八Android 启动过程详解

    Android 启动过程详解 Android从Linux系统启动有4个步骤: (1) init进程启动 (2) Native服务启动 (3) System Server,Android服务启动 (4) ...

  7. Android启动过程以及各个镜像的关系

    Android启动过程 Android在启动的时候,会由UBOOT传入一个init参数,这个init参数指定了开机的时候第一个运行的程序,默认就是init程序,这个程序在ramdisk.img中.可以 ...

  8. Android(java)学习笔记162:Android启动过程(转载)

    转载路径为: http://blog.jobbole.com/67931/ 1. 关于Android启动过程的问题: 当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么样 ...

  9. Android启动过程深入解析

    本文由 伯乐在线 - 云海之巅 翻译.未经许可,禁止转载!英文出处:kpbird.欢迎加入翻译小组. 当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么样的? 什么是Li ...

随机推荐

  1. Webwork【02】前端OGNL试练

    1.OGNL 出现的意义 在mvc中,数据是在各个层次之间进行流转是一个不争的事实.而这种流转,也就会面临一些困境,这些困境,是由于数据在不同世界中的表现形式不同而造成的: a. 数据在页面上是一个扁 ...

  2. JQuery EasyUI学习笔记

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6690888.html  简介与准备 jQuery EasyUI 是一个基于 jQuery 的框架,集成了各种用 ...

  3. linux find command information more

    查找文件find ./ -type f 查找目录find ./ -type d 查找名字为test的文件或目录find ./ -name test 查找名字符合正则表达式的文件,注意前面的‘.*’(查 ...

  4. Centos 7 文件和目录管理

    查看权限在终端输入:  ls -l xxx.xxx (xxx.xxx是文件名)  那么就会出现相类似的信息,主要都是这些:  -rw-rw-r--  其中: 最前面那个 - 代表的是类型      中 ...

  5. Echarts学习记录——如何给x轴文字标签添加事件

    Echarts学习记录——如何给x轴文字标签添加事件 关键属性 axisLabel下属性clickable:true 并给图表添加单击事件 根据返回值判断点击的是哪里 感觉自己的方法有点变扭,有更好办 ...

  6. django之创建第7个项目-url配置

    1.配置urls.py from django.conf.urls import patterns, include, url #Uncomment the next two lines to ena ...

  7. 一个进程(Process)最多可以生成多少个线程(Thread)

    1.进程中创建线程的限制 默认情况下,一个线程的栈要预留1M的内存空间,而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程,但是内存当然不可能完全拿来作线程的栈,所以实际 ...

  8. JavaScript Boolean Object 逻辑

    Create a Boolean Object The Boolean object represents two values: "true" or "false&qu ...

  9. java 结束程序进程 代码

    结束firefox的进程,一句代码就够了,如下: Runtime.getRuntime().exec("taskkill /F /IM firefox.exe"); 结束qq: R ...

  10. property相关参数介绍

    1.copy 使用类型 :NSString,block 2.assign使用类型 :delegate,int,float,NSInteger,bool,枚举,结构体... 3.retain使用类型 : ...