ActivityManagerService是Android系统中一个特别重要的系统服务,AMS与APP互动最多的系统服务之一。ActivityManagerService(以下简称AMS) 主要负责四大组件的启动、切换、调度以及应用进程的管理和调度工作,所有的APP应用都需要 与AMS互动。AMS服务架构几个重要组成部分:
AMS在system_server进程中启动SystemServer.java #startBootstrapServices()
public final class SystemServer {
...
public SystemServer() {
// Check for factory test mode.
mFactoryTestMode = FactoryTest.getMode();
// Remember if it's runtime restart(when sys.boot_completed is already set) or reboot
mRuntimeRestart = "1".equals(SystemProperties.get("sys.boot_completed"));
mRuntimeStartElapsedTime = SystemClock.elapsedRealtime();
mRuntimeStartUptime = SystemClock.uptimeMillis();
}
private void run() {
...
// Start services.
try {
traceBeginAndSlog("StartServices");
startBootstrapServices();
startCoreServices();
startOtherServices();
SystemServerInitThreadPool.shutdown();
} catch (Throwable ex) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting system services", ex);
throw ex;
} finally {
traceEnd();
}
...
}
startBootstrapServices(加载核心服务)中加载的,加载后就startCoreServices启动核心服务,然后startOtherServices启动其他服务,最后Looper.loop进入循环,在startBootstrapServices中,通过SystemServiceManager.startservice,在通过反射创建的LifeCycle中真正创建了AMS服务
private void startBootstrapServices() {
...
// Activity manager runs the show.
traceBeginAndSlog("StartActivityManager");
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
traceEnd();
...
}
从java角度来看,ams就是一个java对象,实现了Ibinder接口,所以它是一个用于进程之间通信的接口
AMS是一个服务: ActivityManagerService从名字就可以看出,它是一个服务,用来管理Activity,而且是一个系统服务,就是包管理服务,电池管理服务,震动管理服务等。
AMS是一个Binder ams实现了Ibinder接口,所以它是一个Binder,这意味着他不但可以用于进程间通信,还是一个线程,因为一个Binder就是一个线程。
Android的ActivityManagerService(简称AMS) 源码分析
https://blog.51cto.com/u_15375308/4996247
TaskRecord即任务栈,每一个TaskRecord都可能存在一个或多个ActivityRecord,栈顶的ActivityRecord表示当前可见的界面。一个App是可能有多个TaskRecord存在的,一般情况下,启动App的第一个activity时,AMS为其创建一个TaskRecord任务栈特殊情况,启动singleTask的Activity,而且为该Activity指定了和包名不同的taskAffiffiffinity,也会为该activity创建一个新的TaskRecord。
ActivityStack是系统中用于管理TaskRecord的,内部维护了一个ArrayList。ActivityStackSupervisor内部有两个不同的ActivityStack对象:mHomeStack、mFocusedStack,用来管理不同的任务。我们启动的App对应的TaskRecord由非Launcher ActivityStack管理,它是在系统启动第一个app时创建的。
ActivityStackSupervisor管理着多个ActivityStack,但当前只会有一个获取焦点(Focused)的ActivityStack;
AMS对象只会存在一个,在初始化的时候,会创建一个唯一的ActivityStackSupervisor对象