1.概览
SystemServiceManager 类用于创建、启动各种系统服务,并且这些系统服务必须是 com.android.server.SystemService 的子类。除此之外,它还支持系统服务启动状态的通知及处理。用户使用方法 startBootPhase 来发送并告知通过 SystemService 启动的服务当前系统的启动阶段,对于AndroidT 中所支持的通知阶段见 SystemService.PHASE_*。用户通过复写 onBootPhase方法来处理其需要针对不同系统事项。例如只有在ActivityTaskManagerService接收到系统处于阶段PHASE_SYSTEM_SERVICES_READY的时候才会去获取服务DisplayOffloadInternal.
//frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
public static final class Lifecycle extends SystemService {
@Override
public void onBootPhase(int phase) {
super.onBootPhase(phase);
if (phase == PHASE_SYSTEM_SERVICES_READY) {
mService.mDisplayOffloadInternal = LocalServices.getService(
DisplayOffloadInternal.class);
}
}
}
2.实例化
//frameworks/base/services/java/com/android/server/SystemServer.java
//private SystemServiceManager mSystemServiceManager;
private void run() {
mSystemServiceManager = new SystemServiceManager(mSystemContext);
//code 1
mContext = context;
//code 2
mServices = new ArrayList<>();
mServiceClassnames = new ArraySet<>();
//code 3 Disable using the thread pool for low ram devices
sUseLifecycleThreadPool = sUseLifecycleThreadPool
&& !ActivityManager.isLowRamDeviceStatic();
mNumUserPoolThreads = Math.min(Runtime.getRuntime().availableProcessors(),
DEFAULT_MAX_USER_POOL_THREADS);
2.1 code 1–记录上下文
注意此处传入的是 mSystemContext 并非ui
//frameworks/base/services/java/com/android/server/SystemServer.java
private void createSystemContext() {
ActivityThread activityThread = ActivityThread.systemMain();
mSystemContext = activityThread.getSystemContext();
}
在Android中,将Context按共有的工具类去理解就行。
2.2 code 2–记录已注册的服务
mServices用于记录类实例,mServiceClassnames则是记录类名。
2.3 code 3–设置线程池
设备所能支持的线程越多那么就需要更强悍的性能及内存,所以此处会根据Android所运行的设备情况来调整线程池的数量。
3.根据类名启动系统服务–startService
public <T extends SystemService> T startService(Class<T> serviceClass) {
//code 1
final String name = serviceClass.getName();
final T service;
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
//code 2
startService(service);
//code 3
return service;
}
3.1 code 1–实例化系统服务
实例化的时候,选用的是只有单入参Context的构造方法,并传入 mSystemContext。
3.1 code 2–启动系统服务
除了将传入的类实例、类名分别存入 mServices 和 mServiceClassnames 外,还会调用其 onStart方法。一般在 onStart 方法内做一些初始化操作。
3.1 code 3–返回系统服务
创建好后则会返回被实例化的系统服。
4.总结
通过 SystemServiceManager 启动的服务流程如下
a)使用其单入参Context的构造函数进行实例构造。
b)记录类实例及类名,方便内部查找。
c)调用类实例中的onStart方法。
d)返回实例化类。