2023金三银四常见Android AMS面试总结,附带答案
创始人
2024-06-02 00:52:10
0

在Android面试中,经常会遇到与ActivityManagerService相关的面试题,ActivityManagerService是Activity的管理类,会延伸出很多的问题,下面总结如下:

1、简述ActivityManagerService的作用,什么时候初始化?

ActivityManagerService 主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似。

ActivityManagerService进行初始化的时机很明确,就是在SystemServer进程开启的时候,就会初始化ActivityManagerService, 可以在SystemServer类中找到相关的启动代码。

2,简述ActivityThread和ApplicationThread,以及关系和区别

ActivityThread

ActivityThread在Android中代表Android的主线程,但是并不是一个Thread类。ActivityThread类是Android 进程的初始类,它的main函数是这个App进程的入口。当创建完新进程之后,main函数被加载,然后执行一个loop的循环使当前线程进入消息循环。

ApplicationThread

ApplicationThread是ActivityThread的内部类, 是一个Binder对象。在此处它是作为IApplicationThread对象的server端等待client端的请求然后进行处理,最大的client就是AMS。

首先,我们看一下Activity的启动逻辑过程:Applicationthread的ScheduleActivity通过一个叫H的Handler发送了一个启动Activity信息。handleLaunchActivity接收了这个消息,然后做处理,处理的逻辑是让PreformLaunchActivity处理,并最终执行Activity的启动。

3,Instrumentation是什么,和ActivityThread是什么关系

Instrumentation 是Android系统中一系列控制方法的集合(hook),这些方法可以在正常的生命周期之外控制Android控件的运行,也可以控制Andoroid如何加载应用程序。

事实上,AMS与ActivityThread之间诸如Activity的创建、暂停等的交互工作都是由Instrumentation操作的。并且每个Activity都持有一个Instrumentation对象的一个引用, 整个进程中是只有一个Instrumentation。当startActivityForResult()调用之后,实际上还是调用了mInstrumentation.execStartActivity()。

它们之间的关系如下:AMS是大BOSS资本,负责指挥和调度的,ActivityThread是企业老板,虽然说企业的事自己说了算,但是需要听从AMS的指挥,而Instrumentation则是CTO,负责项目的大事小事,但是一般不抛头露面,听老板ActivityThread的安排。

4,ActivityManagerService和zygote进程通信是如何实现的

应用启动时,Launcher进程请求AMS,AMS发送创建应用进程请求,Zygote进程接受请求并fork应用进程。而AMS发送创建应用进程请求调用的是 ZygoteState.connect() 方法,ZygoteState 是 ZygoteProcess 的内部类。

publicstatic ZygoteState connect(LocalSocketAddress address)throws IOException {DataInputStreamzygoteInputStream=null;BufferedWriterzygoteWriter=null;finalLocalSocketzygoteSocket=newLocalSocket();try {zygoteSocket.connect(address);zygoteInputStream = newDataInputStream(zygoteSocket.getInputStream());zygoteWriter = newBufferedWriter(newOutputStreamWriter(zygoteSocket.getOutputStream()), 256);} catch (IOException ex) {try {zygoteSocket.close();} catch (IOException ignore) {}throw ex;}returnnewZygoteState(zygoteSocket, zygoteInputStream, zygoteWriter,Arrays.asList(abiListString.split(",")));}
复制代码

Zygote 处理客户端请求:Zygote 服务端接收到参数之后调用 ZygoteConnection.processOneCommand() 处理参数,并 fork 进程。

最后通过 findStaticMain() 找到 ActivityThread 类的 main() 方法并执行,子进程就这样启动了。

5, ActivityRecord、TaskRecord和ActivityStack

Android AMS主要石负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似。

在7.0及之前,AMS通过代理模式来完成Binder通信,而在8.0之后,AMS通过AIDL完成Binder通信。而在通过AIDL完成Binder通信时,会涉及ActivityRecord、TaskRecord和ActivityStack三个对象。

下面我们看几个概念:

ActivityRecord

Activity管理的最小单位,它对应着一个用户界面。ActivityRecord是应用层Activity组件在AMS中的代表,每一个在应用中启动的Activity,在AMS中都有一个ActivityRecord实例来与之对应,这个ActivityRecord伴随着Activity的启动而创建,也伴随着Activity的终止而销毁。

TaskRecord

TaskRecord即任务栈, 每一个TaskRecord都可能存在一个或多个ActivityRecord,栈顶的ActivityRecord表示当前可见的界面。一个App是可能有多个TaskRecord存在。

一般情况下,启动App的第一个activity时,AMS为其创建一个TaskRecord任务栈。特殊情况,启动singleTask的Activity,而且为该Activity指定了和包名不同的taskAffinity, 也会为该activity创建一个新的TaskRecord。

ActivityStack

ActivityStack,ActivityStack是系统中用于管理TaskRecord的,内部维护了一个ArrayList。ActivityStackSupervisor内部有两个不同的ActivityStack对象:mHomeStack、mFocusedStack,用来管理不同的任务。我们启动的App对应的TaskRecord由非Launcher ActivityStack管理,它是在系统启动第一个app时创建的。

6,ActivityManager、ActivityManagerService、ActivityManagerNative的关系

ActivityManager

ActivityManager服务是对Activity管理、运行时功能管理和运行时数据结构的封装,进程(Process)、应用程序、服务(Service)、任务(Task)信息等。

ActivityManagerService

是与系统所有正在运行着的Acitivity进行交互,对系统所有运行中的Activity相关信息(Task,Memory,Service,App)进行管理和维护。

ActivityManagerService/ActivityManagerProxy

ActivityManagerNative是个抽象类,真正发挥作用的是它的子类ActivityManagerService。ActivityManagerProxy代理类是ActivityManagerNative的内部类;ActivityManager持有的是这个ActivityManagerPorxy代理对象,这样,只需要操作这个代理对象就能操作其业务实现的方法。那么真正实现其也业务的则是在ActivityManagerService中。

不过,ActivityManagerNative在API 26 已经过时了,现在对Activity的管理都使用的是ActivityManager。

7,最后:

最近整理很多Android面试题,一共包含了25个知识点,答案也已经整理好了,但是每个知识点问题都不多,不过都是最近两年比较常见的,有需要的可以点击这里或者点击文末小卡片获取!。

知识点:

Java基础

Android基础

Android中高级

Activity

Service

BroadcastReceiver

ContentProvider

Handler

View绘制

View事件分发

Binder

性能优化

BroadcastReceiver

Viewpager&Fragment

WebView

动画

Bitmap

Ams

APP系统启动流程

序列化及Art

模块化及组件化

热修复

AOP

jetpack

开源框架

相关内容

热门资讯

求经典台词和经典旁白 求经典台词和经典旁白谁有霹雳布袋戏里的经典对白和经典旁白啊?朋友,你尝过失去的滋味吗? 很多人在即将...
小王子第二章主要内容概括 小王子第二章主要内容概括小王子第二章主要内容概括小王子第二章主要内容概括
爱情睡醒了第15集里刘小贝和项... 爱情睡醒了第15集里刘小贝和项天骐跳舞时唱的那首歌是什么谢谢开始找舞伴的时候是林俊杰的《背对背拥抱》...
世界是什么?世界是什么概念?可... 世界是什么?世界是什么概念?可以干什么?物质的和意识的 除了我们生活的地方 比方说山 河 公路 ...
全职猎人中小杰和奇牙拿一集被抓 全职猎人中小杰和奇牙拿一集被抓动画片是第五十九集,五十八集被发现,五十九被带回基地,六十逃走
“不周山”意思是什么 “不周山”意思是什么快快快快......一座山,神话里被共工撞倒了。
《揭秘》一元一分15张跑得快群... 一元一分麻将群加群主微【ab120590】【tj525555】 【mj120590】等风也等你。喜欢...
玩家必看手机正规红中麻将群@2... 好运连连,全网推荐:(ab120590)(mj120590)【tj525555】-Q号:(QQ443...
始作俑者15张跑的快群@24小... 微信一元麻将群群主微【ab120590】 【tj525555】【mj120590】一元一分群内结算,...
《重大通知》24小时一元红中麻... 加V【ab120590】【tj525555】【mj120590】红中癞子、跑得快,等等,加不上微信就...
盘点一下正规一块红中麻将群@2... 一元一分麻将群加群主微:微【ab120590】 【mj120590】【tj525555】喜欢手机上打...
(免押金)上下分一元一分麻将群... 微【ab120590】 【mj120590】【tj525555】专业麻将群三年房费全网最低,APP苹...
[解读]正规红中麻将跑的快@群... 微信一元麻将群群主微【ab120590】 【tj525555】【mj120590】一元一分群内结算,...
《普及一下》全天24小时红中... 微【ab120590】 【mj120590】【tj525555】专业麻将群三年房费全网最低,APP苹...
优酷视频一元一分正规红中麻将... 好运连连,全网推荐:(ab120590)(mj120590)【tj525555】-Q号:(QQ443...
《火爆》加入附近红中麻将群@(... 群主微【ab120590】 【mj120590】【tj525555】免带押进群,群内跑包包赔支持验证...
《字节跳动》哪里有一元一分红中... 1.进群方式-[ab120590]或者《mj120590》【tj525555】--QQ(QQ4434...
全网普及红中癞子麻将群@202... 好运连连,全网推荐:(ab120590)(mj120590)【tj525555】-Q号:(QQ443...
「独家解读」一元一分麻将群哪里... 1.进群方式《ab120590》或者《mj120590》《tj525555》--QQ(4434063...
通知24小时不熄火跑的快群@2... 1.进群方式《ab120590》或者《mj120590》《tj525555》--QQ(4434063...