- 统一调度各个应用程序的Activity。
应用程序需要启动Activity–>报告给AMS,决定是否可以启动–>如果可以,通知应用程序运行指定Activity。
AMS必须知道各个应用程序运行的Activity。
- 内存管理。
Activity退出时不会立即被杀死,只有在内存紧张时才会自动被杀,这些操作由AMS管理。
- 进程管理。
AMS向外提供了查询系统正在运行的进程信息的API。
1.启动流程
AMS在SystemServer进程initAndLoop()函数中被启动并且初始化,进过以下步骤:
-
AMS.main()函数,创建AMS实例,并且创建Android运行环境得到一个ActivityThread和一个Context。
-
AMS.setSystemProcess()函数,注册AMS服务到ServiceManager中。并且为system_server进程创建ProcessRecord,将该进程纳入管理中。
-
AMS.installSystemProvider()函数,为system_server进程加载SettingsProvider。
-
AMS.systemReady()函数,做系统启动完毕后的工作,呈现HomeActivity。
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—>报告给AMS,其内部维护所有应用进程启动或者停止Activity的记录—>AMS更新内部记录,并通知客户端进程操作—>客户端进程接收通知,执行操作
启动Activity的各种方式:
-
应用程序中调用startActivity()
-
在Home程序中单击应用程序图标启动Activity
-
按“back”停止当前Activity启动新Activity
-
长按“home”显示当前任务列表选择一个启动
1.ActivityThread类关系
AMS通过Binder跨进程通知ActivityThread启动、停止指定Activity。
ActivityThread作为Binder服务端实现指定接口由AMS远程调用。
ActivityThread可以看做是进程的Android运行环境。
2.Activity的launchMode
-
standard:默认启动模式,不管有没有已存在的实例都生成新的实例。
-
singleTop:如果栈顶存在对应的实例则重复利用不生产新的实例,不存在则新建实例。
-
singleTask:如果栈内存在对于的实例则使此Activity实例之上的其他Activity实例都出栈,使此Activity实例成为栈顶对象显示。
-
singleInstance:启用一个新栈放入新建Activity实例,并且该栈内只允许存在这一个Activity实例。
Intent中涉及到的Activity启动方式常量:
-
FLAG_ACTIVITY_NEW_TASK:将目标Activity放置到新的task中。
-
FLAG_ACTIVITY_CLEAR_TASK:启动一个Activity时先清除和其有关联的task,并新建Activity实例将其放入新的task中。必须和上面变量一起使用
-
FLAG_ACTIVITY_CLEAR_TOP:启动一个不处于栈顶的Activity时,清除排在它前面的Activity使其显示出来。
3.AMS启动Activity流程
以下实例为使用am命令启动一个Activity的流程:
整个调用步骤过程如下:
1.首先IPC调用AMS方法传入参数启动指定Activity
2.在AMS中首先查询PKMS获取该ActivityInfo,新建ActivityRecord和根据lunchMod创建TaskRecord两个重要变量,并且将ActivityRecord添加到task栈顶作为准备启动的Activity。
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!