我眼中的Activity的工作过程

原创 2016年08月29日 15:44:11
        我们都知道平常在使用Activity的过程中,只需要调用Activity的startActivity方法,传入适当的参数就可以启动一个我们想要启动的Activity了,但是你知道这个过程中经历了些什么吗?今天我想从FrameWork层面解释下从系统启动到显示出我们的第一个Activity的整个过程,也算是对面试题:说一下一个Android APP从点击打开开始,是怎样展示在用户面前的回答了,我不打算从源码角度进行分析,只希望能够将整个逻辑流程捋清楚就可以啦;
        (1):首先,系统刚刚启动的时候加载的是Linux内核,在Linux内核加载完成之后会创建出来一个init进程,启动init进程解析init.rc文件首先会fork出一个叫ServerManager的子进程,该进程主要用于管理我们的系统服务,他内部存在一个server服务列表,这个列表中存储的就是那些已经注册的系统服务,随后init进程会fork出一个Zygote的子进程,Zygote进程是一个守护进程,之后,当我们的应用程序想要启动的时候,实际上是由Zygote来fork出子进程给我们的应用程序的,这就保证了我们的应用程序运行在单独的子进程中,即使一个应用程序奔溃也不会影响另一个应用程序的执行;
        (2):在Zygote进程启动之后,会通过ZygoteInit的main方法fork出一个SystemServer子进程,SystemServer进程在启动的时候会创建ActivityThread对象以及系统上下文,注意一点就是虽然ActivityThread里面带有Thread,但他仅仅是一个普通的final类而已,并没有继承Thread或者实现Runnable接口,在ActivityThread里面存在一个内部类ApplicationThread,虽然ApplicationThread里面带有Thread,同样他也没有继承Thread或者实现Runnable接口,他实际上是一个Binder类,接着在SystemServer的main方法里面会创建ServerThread对象(同样虽然ServerThread里面带有Thread,但他只是一个普通类),并且调用他的initAndLoop方法,在initAndLoop方法里面会初始化诸如ActivityManagerService等一系列系统级Service对象,并且调用ServerManager的addService方法,将这些Service服务注册到ServerManager里面,同时启动这些服务;到这里,系统进程的启动工作就结束了,之后,会开启系统Launcher程序来完成系统界面的加载与显示;
        (3):在我们点击应用程序的桌面图标的时候,App就由Launcher开始启动了,Launcher实际上是继承了Activity的,并且实现了点击、长点击等等监听器,在点击桌面图标的时候,实际上执行的是Launcher的onClick方法,在onClick里面会执行我们Activity的startActivitySafely方法,因为Launcher是继承自Activity的嘛,所以它里面的大多数方法都会辗转到Activity中去执行的,在startActivitySafely方法里面实际上执行的就是startActivity方法了,这个方法就是我们通常跳转Activity的时候调用的方法,这个方法里面会执行startActivityForResult方法,紧接着执行的是Instrumentation的execStartActivity方法,Instrumentation可以认为是一个大管家,每个Activity都持有一个Instrumentation对象的一个引用,但是整个进程中是只有一个Instrumentation的,AMS与ActivityThread之间诸如Activity的创建、暂停等的交互工作实际上是由Instrumentation具体操作的,在这里我们应该明白一点就是我们的ActivityManagerService是属于系统级服务的,而ActivityThread是用于管理应用程序的主线程执行的,而系统级服务和应用程序的ActivityThread是属于不同进程的,因此他们两者之间的交互是需要用到Binder通信的,而ActivityThread工作的真正执行者是Instrumentation,因此Instrumentation与AMS的交互是涉及到Binder通信的,也就是说Instrumentation的execStartActivity实际上是通过Binder与AMS进行通信的,在execStartActivity里面通过获得AMS在客户端的代理   ActivityManagerProxy,调用他的startActivity方法实际上最终执行到的就是AMS的startActivity方法,在AMS的startActivity方法中实际上通过ActivityStackSupervision与ActivityStack来交互操作完成Activity启动的,最终会执行到ApplicationThread的scheduleLaunchActivity方法来启动Activity,scheduleLaunchActivity会通过Handler来发送创建Activity的消息给主线程,也就是ActivityThread,而ActivityThread在接收到这个创建消息之后会调用他自己的handleLaunchActivity方法,这个方法会执行performLaunchActivity方法,在performLaunchActivity方法里面就会通过Instrumentation通过反射来创建一个Activity对象出来了,在创建完Activity之后就会调用Instrumentation的callActivityOnCreate方法来启动Activity,callActivityOnCreate实际上执行的是Activity的onCreate方法,进行一些必要的初始化操作;
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

启动Activity的流程(Launcher中点击图标启动)

启动Activity一般有多种方式,常见的有三种: 在Launcher桌面点击app图标 调用startActivity启动一个Activity 命令am start启动 ...

android (三)、Activity工作原理

由Launcher启动一个新的应用程序时,launcher会调用startActivity来启动Activity。假设进程应经fork,ActivityThread已经创建过,Launcher通过Bi...

Activity的工作过程

(1)Android作为一个优秀的基于Linux的操作系统,其内部有许多值得我们学习和借鉴的地方。 首先Android系统启动的时候加载的是Linux内核,在Linux内核加载完成之后会创建出来一个...
  • nhgfd
  • nhgfd
  • 2017年02月19日 18:20
  • 428

Activity工作流程

从startActivity/startActivityForResult开始,不管是哪种方式,最终调到的都是下面的startActivityForResult。// Activity public ...

Android Activity原理以及其子类描述

Activity是Android应用程序组件,实现一个用户交互窗口,我们可以实现布局填充屏幕,也可以实现悬浮窗口。一个app由很多个Actvitiy组合而成,它们之间用intent-filter区别主...

android全屏/沉浸式状态栏下,各种键盘挡住输入框解决办法

*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在开发中,经常会遇到键盘挡住输入框的情况,比如登录界面或注册界面,弹出的软键盘把登录或注册按钮挡住了,用户必须把软键盘收起,才能点...
  • smileiam
  • smileiam
  • 2017年04月04日 11:03
  • 12595

Subversion 用户眼中的 Git (2): 版本库, 工作区如影随形

Subversion 的工作区和版本库截然分开,工作区中的修改要提交到版本库,可能是本机另外一个目录的版本库,也可能是通过网络连接到服务器上的版本库。 而 Git 的工作区和版本库是如影随形的。没有使...

我眼中的Window创建/添加/删除/更新过程

在Android中和我们打交道最多的就是Activity,因为我们会频繁的与界面进行交互,而Activity内部关于界面方面的操作都是由Window来实现的,因此我们有必要了解下Window的实现机制...

小白眼中的C语言学习过程

学习过程中的一些感受 虽说还是小白,但笔者接触c语言已经过了一年了。在这一年的过程中,虽然学习断断续续【上学占用了部分时间,但主要原因还是因为笔者自己的懒惰。】,学习效果也不怎么好,但对于c,却有着...

activity工作流介绍

  • 2017年07月13日 10:00
  • 908KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我眼中的Activity的工作过程
举报原因:
原因补充:

(最多只允许输入30个字)