Activity启动流程

Activity 启动流程的了解可以反映出一个开发人员对Android架构,进程通信,源码阅读能力等,这常常是一个面试者经常遇到的问题。以下从几个角度来说明。

流程概述

整个Activity的启动流程从在桌面上点击图标开始,然后进行了一系列的过程直至新的Activity的界面显示出来的过程。

流程图示:
image

一共涉及到了四个进程,这四个进程分别是Launcher进程,system_server进程,zygote进程,app进程。

启动流程概述:

  • Launcher进程中点击桌面App图标,onclick事件触发,调用startActivity(intent),在该方法中通过instrumentaion采用Binder call向system_server(即AMS)进程发起startActivity请求;

  • 调用startActivity(intent)方法,该方法在Activity类实现。startActivity调用的还是startActivityForResult()。

  • IPC过程
  • system_server进程接收到请求后,向zygote进程发送创建进程的请求;

  • Zygote进程fork出新的子进程,即App进程;

  • App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;

  • system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;

  • App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;

  • 主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。

  • 到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI
    渲染结束后便可以看到App的主界面。

理论基础

  1. zygote
    zygote意为“受精卵,合子“。在Linux中,所有的进程(包括zygote进程)都是由init进程直接或者是间接fork出来的。
    Linux的内核加载完成之后就会启动“init“的进程。之后初始化zygote进程,这里的zygote只是一个进程的名字。
    每一个App都是一个单独的进程,当zygote进程运行之后,再开启App,为了实现资源共用和更快的启动速度,fork zygote的进程。
  2. system_server
    system_server也是一个进程,是由zygote进程fork出来的。system_server和zygote进程是Android Framework里面两大非常重要的进程。
    为什么说system_server非常重要呢?因为系统里面重要的服务都是在这个进程里面开启的,比如 ActivityManagerService、PackageManagerService、WindowManagerService等等。
  3. ActivityManagerService
    简称AMS,服务端对象,负责系统中所有Activity的生命周期。
    在SystemServer进程开启的时候,就会初始化AMS。
    AndroidFramework的C/S架构
    C/S架构不仅仅存在于Web开发中,在Android的框架设计中,使用的也是这一种模式。
    服务器端指的是所有App共用的系统服务,AMS,WMS,PMS等,当某个App想实现某个操作的时候,要告诉这些系统服务。
    比如你想打开一个App,AMS来通知zygote进程来fork一个新进程,来开启我们的目标App的。就像是浏览器想要打开一个超链接一样。
    App和AMS(SystemServer进程)还有zygote进程分属于三个独立的进程,他们之间如何通信呢?
  • App与AMS通过Binder进行IPC通信,AMS(SystemServer进程)与zygote通过Socket进行IPC通信。
  • AMS有什么用呢?在前面我们知道了,如果想打开一个App的话,需要AMS去通知zygote进程,除此之外,其实所有的Activity的开启、暂停、关闭都需要AMS来控制,所以我们说,AMS负责系统中所有Activity的生命周期。
  • 任何一个Activity的启动都是由AMS和应用程序进程(主要是ActivityThread)相互配合来完成的。AMS服务统一调度系统中所有进程的Activity启动,而每个Activity的启动过程则由其所属的进程具体来完成。
  1. Launcher
    位置:
    packages/apps/Launcher2/src/com/android/launcher2/Launcher.java
  • Launcher也是一个应用程序实现了点击、长按等回调接口,来接收用户的输入。
  • 点击图标的时候,Launcher捕捉图标点击事件,然后startActivity()发送对应的Intent请求。
  1. Instrumentation和ActivityThread
    • 每个Activity都只持有唯一一个Instrumentation对象。 Instrumentation完成对Application和Activity初始化和生命周期的工具类。
    • ActivityThread,依赖于UI线程。App和AMS是通过Binder传递信息的,那么ActivityThread就是专门与AMS的外交工作的。
  2. ApplicationThread
    • App的启动以及Activity的显示都需要AMS的控制,那么我们便需要和服务端的沟通,而这个沟通是双向的。

    • 客户端-->服务端

      • 由于继承了同样的公共接口类,ActivityManagerProxy提供了与ActivityManagerService一样的函数原型,使用户感觉不出Server是运行在本地还是远端,从而可以更加方便的调用这些重要的系统服务。

    • 服务端-->客户端

      • 还是通过Binder通信,不过是换了另外一对,换成了ApplicationThread和ApplicationThreadProxy。

启动流程

1.创建进程

  • ①先从Launcher的startActivity()方法,通过Binder通信,调用ActivityManagerService的startActivity方法。

  • ②一系列折腾,最后调用startProcessLocked()方法来创建新的进程。

  • ③该方法会通过前面讲到的socket通道传递参数给Zygote进程。Zygote孵化自身。调用ZygoteInit.main()方法来实例化ActivityThread对象并最终返回新进程的pid。

  • ④调用ActivityThread.main()方法,ActivityThread随后依次调用Looper.prepareLoop()和Looper.loop()来开启消息循环。

  • 图示

Binder通信

图示


图片的简写:
ATP: ApplicationThreadProxy
AT: ApplicationThread
AMP: ActivityManagerProxy
AMS: ActivityManagerService


以上就是对Activity启动流程的介绍,一般作为中高级工程师会在面试的过程中问到。比如百度面试中问到Activity的创建和Activity的生命周期在哪个地方管理,这里是ActivityThread里,头条的面试,app中application和AMS如何进行的双向通信等。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容