Android Framework 面试题系列之AMS
发布网友
发布时间:2024-09-17 03:20
我来回答
共1个回答
热心网友
时间:2024-10-21 09:49
在Android面试中,经常会出现关于ActivityManagerService(AMS)的问题。AMS是负责管理Activity的类,由此衍生出许多问题。以下是对这些问题的总结:
1. 简述ActivityManagerService的作用及初始化时机。
ActivityManagerService主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作。它的职责与操作系统中的进程管理和调度模块类似。AMS在SystemServer进程开启时进行初始化,相关启动代码可在SystemServer类中找到。
2. 简述ActivityThread和ApplicationThread,以及它们的关系和区别。
ActivityThread在Android中代表主线程,但不是一个Thread类。它是Android进程的初始类,main函数是该App进程的入口。ApplicationThread是ActivityThread的内部类,是一个Binder对象。它作为IApplicationThread对象的server端等待client端的请求,最大的client就是AMS。Activity启动逻辑过程中,ApplicationThread的ScheleActivity通过一个叫H的Handler发送启动Activity信息,handleLaunchActivity接收消息并处理,最终执行Activity的启动。
3. 介绍Instrumentation及其与ActivityThread的关系。
Instrumentation是Android系统中一系列控制方法的集合(hook),可以在正常生命周期之外控制Android控件的运行,也可以控制Android如何加载应用程序。AMS与ActivityThread之间的交互工作,如Activity的创建、暂停等,都是由Instrumentation操作的。每个Activity都持有一个Instrumentation对象的一个引用,整个进程中只有一个Instrumentation。当startActivityForResult()调用之后,实际上还是调用了mInstrumentation.execStartActivity()。
4. 介绍ActivityManagerService和zygote进程通信的实现方式。
应用启动时,Launcher进程请求AMS,AMS发送创建应用进程请求,Zygote进程接受请求并fork应用进程。Zygote处理客户端请求后,调用ZygoteConnection.processOneCommand()处理参数,并fork进程。最后通过findStaticMain()找到ActivityThread类的main()方法并执行,子进程就这样启动了。
5. 介绍ActivityRecord、TaskRecord和ActivityStack。
ActivityRecord是应用层Activity组件在AMS中的代表,每个在应用中启动的Activity,在AMS中都有一个ActivityRecord实例与之对应。TaskRecord即任务栈,每个TaskRecord可能存在一个或多个ActivityRecord,栈顶的ActivityRecord表示当前可见的界面。ActivityStack用于管理TaskRecord,内部维护了一个ArrayList。ActivityStackSupervisor内部有两个不同的ActivityStack对象:mHomeStack、mFocusedStack,用于管理不同的任务。
6. 介绍ActivityManager、ActivityManagerService和ActivityManagerNative的关系。
ActivityManager是对Activity管理、运行时功能管理和运行时数据结构的封装。ActivityManagerService是与系统所有正在运行着的Activity进行交互,对系统所有运行中的Activity相关信息进行管理和维护。ActivityManagerNative是一个抽象类,真正发挥作用的是它的子类ActivityManagerService。ActivityManager持有的是这个ActivityManagerProxy代理对象,这样只需要操作这个代理对象就能操作其业务实现的方法。不过,ActivityManagerNative在API 26已经过时了,现在对Activity的管理都使用的是ActivityManager。