除去熟悉的ams、pms、wms之外,系统中还具有各式各样形形色色的service,同样作为service,其启动形式上有很大差别
(一)由SystemService和SystemServiceManager控制
SystemService作为一个运行在SystemServer的基类,为用户需要实现的service提供了一套生命周期,就跟Activity类似的一套周期,需要用户override部分生命周期函数来保证正常工作
onStart():让service跑起来,跑起来之后需要调用publishBinderService将service注册到ServiceManager(本质上就是通知servicemanager来add这样一个service)
onBootPhase(int):这个函数应该是systemserver在启动的时候会多次调用,参数代表当前启动进行到了什么阶段,用户定义的service针对各个阶段需要做怎样的处理或者是不做任何处理
例子:mount service中,当phase处于PHASE_ACTIVITY_MANAGER_READY,也就是Activitymanager准备就绪之后,mount service就要做这步操作
@Override
public void onBootPhase(int phase) {
if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {
mMountService.systemReady();
}
}
这类继承了SystemService的类,很容易能够被管理起来,又声明周期来进行控制
但是针对以前设计的Service,例如很多Service并非继承自SystemService的,而是继承自各类interface的。这种service就在内部定义了一个静态内部类,LifeCycle继承子SystemService,来辅助完成控制。
如MountService中就定义了一个这样的静态内部类
public static class Lifecycle extends SystemService {
private MountService mMountService;
public Lifecycle(Context context) {
super(context);
}
@Override
public void onStart() {
mMountService = new MountService(getContext());
publishBinderService("mount", mMountService);
}
@Override
public void onBootPhase(int phase) {
if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {
mMountService.systemReady();
}
}
@Override
public void onStartUser(int userHandle) {
mMountService.onStartUser(userHandle);
}
@Override
public void onCleanupUser(int userHandle) {
mMountService.onCleanupUser(userHandle);
}
}
SystemServer中启动MountService的时候
private static final String MOUNT_SERVICE_CLASS =
"com.android.server.MountService$Lifecycle";
......
mSystemServiceManager.startService(MOUNT_SERVICE_CLASS);
首先定义了一个内部类的字符串,利用反射来加载这个类
public SystemService startService(String className) {
final Class<SystemService> serviceClass;
try {
serviceClass = (Class<SystemService>)Class.forName(className);
} catch (ClassNotFoundException ex) {
......
}
return startService(serviceClass);
}
启动这个类
public <T extends SystemService> T startService(Class<T> serviceClass) {
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
......
mServices.add(service);
......
service.onStart();
......
}
这里就调用了SystemService的生命周期,将service启动起来了
(二)第二类Service,就仅仅实现了要提供给外面的接口,不涉及生命周期的管束。
PackageManagerService就是这类,SystemServer都是去显示调用它的主要生命函数,例如main等
走形式上service大概就这两类吧,以后遇到新的就再补充@.@