在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 的内部类。
public static ZygoteState connect(LocalSocketAddress address) throws IOException {
DataInputStream zygoteInputStream = null;
BufferedWriter zygoteWriter = null;
final LocalSocket zygoteSocket = new LocalSocket();
try {
zygoteSocket.connect(address);
zygoteInputStream = new DataInputStream(zygoteSocket.getInputStream());
zygoteWriter = new BufferedWriter(new OutputStreamWriter(
zygoteSocket.getOutputStream()), 256);
} catch (IOException ex) {
try {
zygoteSocket.close();
} catch (IOException ignore) {
}
throw ex;
}
return new ZygoteState(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。

