Android开发Android技术知识Android开发经验谈

细谈APP开发焦点问题:AMS 系统时间调节原理

2022-07-17  本文已影响0人  程序老秃子

前言

AMS提供的主要功能:

应用程序需要启动Activity–>报告给AMS,决定是否可以启动–>如果可以,通知应用程序运行指定Activity

AMS必须知道各个应用程序运行的Activity

Activity退出时不会立即被杀死,只有在内存紧张时才会自动被杀,这些操作由AMS管理

AMS向外提供了查询系统正在运行的进程信息的API

一、AMS启动

1.启动流程

AMS在SystemServer进程initAndLoop()函数中被启动并且初始化,进过以下步骤:

2.AMS重要数据结构

AMS定义了几个数据类用于Process、Activity、Task信息

2.1 进程数据类ProcessRecord

用于记录一个进程相关信息

2.2保存Activity信息数据类ActivityRecord

用于保存一个Activity的信息

在ActivityRecord内部提供Token类实现IApplicationToken.Stub可以实现IPC回调其方法。一般是在WMS内部对其IPC调用

2.3任务栈信息数据类TaskRecord

记录Activity所属任务栈信息。

二、Activity调度机制

Activity调度过程:

应用进程启动或者停止Activity—>报告给AMS,其内部维护所有应用进程启动或者停止Activity的记录—>AMS更新内部记录,并通知客户端进程操作—>客户端进程接收通知,执行操作

启动Activity的各种方式:

1.ActivityThread类关系

2.Activity的launchMode

Intent中涉及到的Activity启动方式常量:

3.AMS启动Activity流程

调用步骤过程如下:

1.首先IPC调用AMS方法传入参数启动指定Activity

2.在AMS中首先查询PKMS获取该ActivityInfo,新建ActivityRecord和根据lunchMod创建TaskRecord两个重要变量,并且将ActivityRecord添加到task栈顶作为准备启动的Activity

3.在正式启动Activity之前首先检查其进程是否启动,为启动时通知AMS启动对应进程

AMS创建Activity对应进程及启动Activity的整个调用步骤过程如下:

1.首先就是zygote进程fork新进程,指定新进程执行需要启动的ActivityThread类

2.在ActivityThread的main()方法中:

3.其中上步骤第二点在与AMS交互中IPC调用AMS的attachApplication()函数中:

4.AMS与应用进程交互时会发出一个异步消息,该消息内部:

5.AMS与应用进程交互完接着准备启动目标Activity,在ActivityStackSupervisor.attachApplicationLocked()函数中会首先获取需要启动的ActivityRecord并保存到对应的ProcessRecord,接着IPC调用应用进程启动Activity

6.在应用进程中也是异步消息处理

7.同时在AMS中会将task添加到最近任务列表中,并且发送10s定时等待这个Activity处理结果

8.此时目标Activity已经被成功启动,接着会处理一些Pending组件,这些组件可能是在系统启动未成功时发起的一些启动指令

最终一个Activity启动成功

更多Android前言技术进阶;我自荐一套《完整的Android的资料,以及一些视频课讲解

现在点击上方链接即可免费获取

最后我想说:

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们

技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面

Android 架构师之路还很漫长,与君共勉

上一篇 下一篇

猜你喜欢

热点阅读