在activity的启动过程中会调用Instrumentation的execStartActivity方法:
涉及代码:
Instrumentation.java core\java\android\app\Instrumentation.java
这里调用到了ActivityManager的getService方法:
ActivityTaskManager.java core\java\android\app\ActivityTaskManager.java
getService方法调用了IActivityTaskManagerSingleton的get方法,IActivityTaskManagerSingleton是一个Singleton类。
这里 public static final String ACTIVITY_TASK_SERVICE = "activity_task";
这里得到IBinder类型的AMS引用,然后将它转换为IActivityTaskManager类型的对象,采用的是AIDL.
要实现进程间通信,服务端也就是AMS只需继承IActivityTaskManager.Stub类并实现相应的方法即可
ActivityManager的getService方法得到IActivityManager ,AMS只需要继承ActivityManager.Stub类就可以和ActivityManager实现进程间通信了
再看看AMS的启动过程:
AMS的启动是在SytemServer中启动的,从SystemServer的main方法看起:
代码:SystemServer.java services\java\com\android\server\SystemServer.java
main方法调用了SystemServer的run方法
private void run() {
try {
....
Looper.prepareMainLooper();//创建消息Looper
Looper.getMainLooper().setSlowLogThresholdMs(
SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
// Initialize native services.
System.loadLibrary("android_servers");//加载动态库
// Create the system service manager.
mSystemServiceManager = new SystemServiceManager(mSystemContext);//创建SystemServiceManager
mSystemServiceManager.setStartInfo(mRuntimeRestart,
mRuntimeStartElapsedTime, mRuntimeStartUptime);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
startBootstrapServices();//启动引导服务
startCoreServices();//启动核心服务
startOtherServices();//启动其他服务
....
}
}
SystemServiceManager会对系统的服务进行创建、启动和生命周期管理
官方把系统服务分为了3种类型,分别是引导服务、核心服务和其他服务,其中其他服务是一些非紧要和不需要立即启动的服务。
我们主要看看引导服务AMS是如何启动的。
startBootstrapServices方法
SystemServer.java services\java\com\android\server\SystemServer.java
private void startBootstrapServices() {
...
ActivityTaskManagerService atm = mSystemServiceManager.startService(
ActivityTaskManagerService.Lifecycle.class).getService(); //调用了SystemServiceManager的getService
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
...
}
SystemServiceManager.java services\core\java\com\android\server\SystemServiceManager.java
在Lifecycle的构造方法中创建了AMS的实例。当调用SystemService类型的service的onStart方法时,实际上调用了构造方法中AMS的start方法。
ssm.startService(ActivityManagerService.Lifecycle.class).getService();实际上得到的就是AMS实例
AMS与应用程序进程的关系:
1 启动应用程序时AMS会检查这个应用程序需要的应用程序进程是否存在
2 如果需要的应用程序进程不存在,AMS就会请求Zygote进程创建需要的应用程序进程