Android Service 形式分类

除去熟悉的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大概就这两类吧,以后遇到新的就再补充@.@

    原文作者:Kelvin wu
    原文地址: https://zhuanlan.zhihu.com/p/20510083
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞