ActivityManagerService的启动
ActivityManagerService
是由SystemServer
启动的。
SystemServer
的main
方法中直接调用了run
方法。
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();
}
....
}
private void startBootstrapServices() {
....
// Activity manager runs the show.
traceBeginAndSlog("StartActivityManager");
// TODO: Might need to move after migration to WM.
ActivityTaskManagerService atm = mSystemServiceManager.startService(
ActivityTaskManagerService.Lifecycle.class).getService();
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
mWindowManagerGlobalLock = atm.getGlobalLock();
traceEnd();
....
}
run
方法中调用了startBootstrapServices
方法, 这个方法里面启动了很多服务, 其中就有ActivityManagerService
这个服务。
总体架构
由图可以知道
ActivityManagerService
的体系实现也是一个Binder
机制的实现。因为ActivityManagerService
与应用程序运行在不同的进程,
所以需要跨进程通信。ActivityManagerService
的作用是管理四大组件的创建,销毁以及生命周期的管理。管理,记录,查询。
启动service的流程
ContextWrapper
与ContextImpl
是典型的装饰者设计模式。 经过一系列方法调用,
最终在ActivityManagerService
的方法realStartServiceLocked
中调用了Service
所在进程的scheduleCreateService
方法。
也标志着ActivityManagerService
所在进程做的事情已经做完了,事情做完指的是各种校验及记录功能完成。
将交由Service
所在进程创建Service
对象等等操作。最后通过反射创建对象的代码在ActivityThread
的handleCreateService
方法。并在此方法中执行Service
的onCreate
方法。Service
启动完成了。
activity启动的流程
流程跟Service
是差不多的, 都是先由app
所在进程调用ActivityManagerService
的方法, ActivityManagerService
经过校验和记录之后, 调用app
所在进程的方法,创建Activity
对象,回调onCreate
方法。