AMS相关面试题

1、ActivityManagerService是什么?什么时候初始化的?有什么作用?

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

ActivityManagerService进行初始化的时机很明确,就是在SystemServer进程开启的时候,就会初始化ActivityManagerService。(系统启动流程)

如果打开一个App的话,需要AMS去通知zygote进程, 所有的Activity的生命周期由AMS来控制。

2、ActivityThread是什么?ApplicationThread是什么?它们的区别

  • ActivityThread
    在Android中它就代表了Android的主线程,它是创建完新进程之后,main函数被加载,然后执行一个loop的循环使当前线程进入消息循环,并且作为主线程。
  • ApplicationThread
    ApplicationThread是ActivityThread的内部类, 是一个Binder对象。在此处它是作为IApplicationThread对象的server端等待client端的请求然后进行处理,最大的client就是AMS。

3、Instrumentation是什么?和ActivityThread是什么关系?

AMS与ActivityThread之间诸如Activity的创建、暂停等的交互工作实际上是由Instrumentation具体操作的。每个Activity都持有一个Instrumentation对象的一个引用, 整个进程中是只有一个Instrumentation。mInstrumentation的初始化在ActivityThread::handleBindApplication函数。

可以用来独立地控制某个组件的生命周期。

Activity的startActivity方法。startActivity会调用mInstrumentation.execStartActivity();

mInstrumentation掉用AMS,AMS通过socket通信告知Zygote进程fork子进程。

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

应用启动时,Launcher进程请求AMS。 AMS发送创建应用进程请求,Zygote进程接受请求并fork应用进程

客户端发送请求:调用 Process.start() 方法新建进程

连接调用的是 ZygoteState.connect() 方法,ZygoteState 是 ZygoteProcess 的内部类。ZygoteState里用的LocalSocket

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,ActivityStackSupervisor,ProcessRecord

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

ActivityStackSupervisor

ActivityStackSupervisor管理着多个ActivityStack,但当前只会有一个获取焦点(Focused)的ActivityStack;

AMS对象只会存在一个,在初始化的时候,会创建一个唯一的ActivityStackSupervisor对象

ProcessRecord

ProcessRecord记录着属于一个进程的所有ActivityRecord,运行在不同TaskRecord中的ActivityRecord可能是属于同一个 ProcessRecord。

总结

  • AMS运行在SystemServer进程中。SystemServer进程启动时,会通过SystemServer.startBootstrapServices()来创建一个AMS的对象;
  • AMS通过ActivityStackSupervisor来管理Activity。AMS对象只会存在一个,在初始化的时候,会创建一个唯一的ActivityStackSupervisor对象;
  • ActivityStackSupervisor中维护了显示设备的信息。当有新的显示设备添加时,会创建一个新的ActivityDisplay对象;
  • ActivityStack与显示设备的绑定。ActivityStack的创建时在Launcher启动时候进行的, AMS还未有非Launcher的ActivityStack。后面的App启动时就会创建Launcher的ActivityStack,
  • 通过ActivityStackSupervisor来创建ActivityRecord
  • 在ActivityStack上创建TaskRecord
  • 每一个ActivityRecord都需要找到自己的宿主TaskRecord

6、ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系

Activity的startActivity方法。startActivity会调用mInstrumentation.execStartActivity(); execStartActivity通过ActivityManager的getService。

  • 代码层面:

ActivityManager.getRunningServices里通过ActivityManagerNative.getDefault得到此代理对象ActivityManagerProxy,ActivityManagerProxy代理类是ActivityManagerNative的内部类。ActivityManagerNative是个抽象类,真正发挥作用的是它的子类ActivityManagerService。

  • 介绍:

ActivityManager

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

ActivityManagerNative、ActivityManagerProxy

IActivityManager继承了Interface接口。而ActivityManagerNative和ActivityManagerPorxy实现了这个IActivityManager接口

ActivityManagerProxy代理类是ActivityManagerNative的内部类;

ActivityManagerNative是个抽象类,真正发挥作用的是它的子类ActivityManagerService

ActivityManager持有的是这个ActivityManagerPorxy代理对象,这样,只需要操作这个代理对象就能操作其业务实现的方法。那么真正实现其也业务的则是ActivityManagerService。

ActivityManagerNative这个类,他继承了Binder而Binder实现了IBinder接口。其子类则是ActivityManagerService。

在这里插入图片描述

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值