Activity启动流程总结

一、Android系统进程简介

1、Android系统进程启动方式:init进程 –> Zygote进程 –> SystemServer进程 –>各种应用进程

2、init进程:linux的根进程,android系统是基于linux系统的,因此可以算作是整个android操作系统的第一个进程

3、Zygote进程:android系统的根进程,主要作用:可以作用Zygote进程fork出SystemServer进程和各种应用进程

4、SystemService进程:主要是在这个进程中启动系统的各项服务,比如ActivityManagerService,PackageManagerService,WindowManagerService服务等等

5、各种应用进程:启动自己编写的客户端应用时,一般都是重新启动一个应用进程,有自己的虚拟机与运行环境


二、Zygoto启动流程

1、初始化DDMS

2、注册Zygote进程的socket通讯

3、初始化Zygote中的各种类,资源文件,OpenGL,类库,Text资源等等

4、初始化完成之后fork出SystemServer进程(android系统中进程之间通讯的方式是Binder,但是有一个例外是SystemService进程与Zygote进程之间是通过Socket的方式进行通讯的)

5、fork出SystemServer进程之后,关闭socket连接


三、SystemServer启动流程

1、SystemServer进程是android中一个很重要的进程由Zygote进程启动

2、SystemServer进程主要用于启动系统中的服务

3、SystemServer在执行过程中首先会初始化一些系统变量,加载类库,创建Context对象,创建SystemServiceManager对象等之后才开始启动系统服务(ActivityThread.systemMain方法创建context

4、SystemServer进程将系统服务分为三类:boot服务(AMS、PMS、LED服务、显示Service等),core服务(电池、webview等)和other服务,并逐步启动

5、SertemServer进程在尝试启动服务之前会首先尝试与Zygote建立socket通讯,只有通讯成功之后才会开始尝试启动服务

6、创建的系统服务过程中主要通过SystemServiceManager对象来管理

7、服务对象都有自己的异步消息对象,并运行在单独的线程中


四、Launcher启动流程

1、Launcher程序是我们平时看到的桌面程序(系统默认第一个启动的应用程序

2、Zygote进程 –> SystemServer进程 –> startOtherService方法 –> ActivityManagerService的systemReady方法 –> startHomeActivityLocked方法 –> ActivityStackSupervisor的startHomeActivity方法 –> 执行Activity的启动逻辑,执行scheduleResumeTopActivities()方法

3、因为是隐士的启动Activity,所以启动的Activity就是在AndroidManifest.xml中配置catogery的值为:

public static final String CATEGORY_HOME = "android.intent.category.HOME";

4、LauncherActivity中是以ListView来显示我们的应用图标列表的,并且为每个Item保存了应用的包名和启动Activity类名,这样点击某一项应用图标的时候就可以根据应用包名和启动Activity名称启动我们的App了


五、应用进程启动流程

1、android应用进程会在需要启动其组件的时候启动,当没有任何组件运行或者是系统内存较低的时候应用进程会被杀死

2、在启动应用四大组件的时候若发现当前应用的进程没有启动,则会首先启动应用程序的进程

3、我们可以为应用程序配置多个进程,每个进程都有自己的JVM和运行环境,各个进程之间的通讯需要通过Binder机制


六、系统启动并解析Manifest的流程

1、android系统启动之后会解析固定目录下的apk文件,并执行解析,持久化apk信息,重新安装等操作

2、解析Manifest流程:Zygote进程 –> SystemServer进程 –> PackgeManagerService服务 –> scanDirLI方法 –> scanPackageLI方法 –> PackageParser.parserPackage方法

3、解析完成Manifest之后会将apk的Manifest信息保存在Settings对象中并持久化,然后执行重新安装的操作(shell的install命令)


七、apk安装流程

1、代码中执行intent.setDataAndType(Uri.parse(“file://” + path),”application/vnd.android.package-archive”);可以调起PackageInstallerActivity

2、PackageInstallerActivity主要用于执行解析apk文件,解析manifest,解析签名等操作

3、InstallAppProcess主要用于执行安装apk逻辑,用于初始化安装界面,用于初始化用户UI。并调用PackageInstaller执行安装逻辑

4、InstallAppProcess内注册有广播,当安装完成之后接收广播,更新UI。显示apk安装完成界面


八、Activity启动流程

1、Activity的启动流程一般是通过调用startActivity或者是startActivityForResult来开始的

2、startActivity内部也是通过调用startActivityForResult来启动Activity,只不过传递的requestCode小于0

3、Activity的启动流程涉及到多个进程之间的通讯这里主要是ActivityThread与ActivityManagerService之间的通讯

4、ActivityThread向ActivityManagerService传递进程间消息通过ActivityManagerNative,ActivityManagerService向ActivityThread进程间传递消息通过IApplicationThread(因为Binder机制是单向的、异步的)

5、ActivityManagerService接收到应用进程创建Activity的请求之后会执行初始化操作,解析启动模式,保存请求信息等一系列操作

6、ActivityManagerService保存完请求信息之后会将当前系统栈顶的Activity执行onPause操作,并且IApplication进程间通讯告诉应用程序继承执行当前栈顶的Activity的onPause方法

7、ActivityThread接收到SystemServer的消息之后会统一交个自身定义的Handler对象处理分发

8、ActivityThread执行完栈顶的Activity的onPause方法之后会通过ActivityManagerNative执行进程间通讯告诉ActivityManagerService,栈顶Actiity已经执行完成onPause方法,继续执行后续操作

9、ActivityManagerService会继续执行启动Activity的逻辑,这时候会判断需要启动的Activity所属的应用进程是否已经启动,若没有启动则首先会启动这个Activity的应用程序进程

10、ActivityManagerService会通过socket与Zygote继承通讯,并告知Zygote进程fork出一个新的应用程序进程,然后执行ActivityThread的mani方法

11、在ActivityThead.main方法中执行初始化操作,初始化主线程异步消息,然后通知ActivityManagerService执行进程初始化操作

12、ActivityManagerService会在执行初始化操作的同时检测当前进程是否有需要创建的Activity对象,若有的话,则执行创建操作

13、ActivityManagerService将执行创建Activity的通知告知ActivityThread,然后通过反射机制创建出Activity对象,并执行Activity的onCreate方法,onStart方法,onResume方法

14、ActivityThread执行完成onResume方法之后告知ActivityManagerService onResume执行完成,开始执行栈顶Activity的onStop方法

15、ActivityManagerService开始执行栈顶的onStop方法并告知ActivityThread

16、ActivityThread执行真正的onStop方法


九、Activity销毁流程

1、Activity的销毁流程是从finish方法开始的

2、Activity销毁过程是:onPause –> onRestart –> onStart –> onResume –> onStop –> onDestroy

3、Activity的销毁流程是ActivityThread与ActivityManagerService相互配合销毁的


十、应用进程Context创建流程

1、Activity中创建ContextImpl对象的具体实现在ActivityThread的performLauncherAcitivty方法中

2、Activity的创建伴随着ContextImpl的创建,二者相互持有对方的引用

3、创建Activity –> 创建Activity相关ContextImpl对象

4、如果没有application,则创建应用进程 –> 创建Application –> 创建Application相关ContextImpl对象(所以只要一个application)

5、application创建过程:ActivityThread.main方法–> ActivityManagerService.bindApplication方法 –> ActivityThread.handleBindApplication –> 创建Instrumentation,创建Application

6、Instrumentation、Application、Activity都是通过java反射机制创建


十一、Activity布局加载流程

1、Activity的展示界面的特性是通过Window对象来控制的

2、每个Activity对象都对应这个一个Window对象,并且Window对象的初始化在启动Activity的时候完成,在执行Activity的onCreate方法之前

3、每个Window对象内部都存在一个FrameLayout类型的mDector对象,它是Acitivty界面的root view

4、Activity中的window对象的实例是PhoneWindow对象,PhoneWindow对象中的几个成员变量mDector,mContentRoot,mContentParent都是View组件,它们的关系是:mDector –> mContentRoot –> mContentParent –> 自定义layoutView

5、LayoutInflater.inflate主要用于将布局文件加载到内存View组件中,也可以设定加载到某一个父组件中

6、典型的Activity的onCreate方法中需要调用super.onCreate方法和setContentView方法,若不调用super.onCreate方法,执行启动该Activity的逻辑会报错,若不执行setContentView的方法,该Activity只会显示一个空页面


十二、Activity布局绘制流程

1、Activity执行onResume之后再ActivityThread中执行Activity的makeVisible方法

2、View的绘制流程包含了测量大小,测量位置,绘制三个流程

3、Activty的界面绘制是从mDector即根View开始的,也就是从mDector的测量大小,测量位置,绘制三个流程

4、View的测量大小流程:performMeasure –> measure –> onMeasure等方法

5、View的测量位置流程:performLayout –> layout –> onLayout等方法

6、View的绘制流程:onDraw等方法(从ViewRootImpl的performTraversals方法开始

7、View组件的绘制流程会在onMeasure,onLayout以及onDraw方法中执行分发逻辑,也就是在onMeasure同时执行子View的测量大小逻辑,在onLayout中同时执行子View的测量位置逻辑,在onDraw中同时执行子View的绘制逻辑

8、Activity中都对应这个一个Window对象,而每一个Window对象都对应着一个新的WindowManager对象(WindowManagerImpl实例)

9、View组件的最终显示落实是通过draw方法实现绘制的,而我们的draw方法的参数是一个Canvas,这是一个画布的对象,通过draw方法就是操作这个对象并显示出来,而Canvas对象之所以能够实现显示的效果是因为其内部保存着一个Bitmap对象,通过操作Canvas对象实质上是操作Canvas对象内部的Bitmap对象,而View组件的显示也就是通过这里的Bitmap来实现的



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值