在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时创立的。

Android AMS面试题

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。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。