SystemServiceManager 详解

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)返回实例化类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值