framework层中系统服务要么直接extend SystemService,要么创建静态内部类Lifcycle extends SystemService,接下来详细介绍下SystemService类,千万不要和SystemServer类搞混了。
SystemService是frameworks/base/services/core/java/com/android/server/SystemService.java。
目录
3. publishBinderService(String name, IBinder service)
4. getBinderService(String name)
5. publishLocalService(Class type, T service)
6. getLocalService(Class type)
一、SystemService概述
它是运行在系统进程中的service的基类,根据需要override和implement生命周期事件回调方法。
SystemService的生命周期方法如下:下边的方法都是由system service的主线程调用。
1.构造函数
用来提供初始化系统service;
2.onStart()
调用该方法启动service。在onStart()中应该调用
publicBinderService(String,IBinder),
把该service公开,这样其他service或者apps可以访问到它。
3.onBootPhase(int)
在收到PHASE_BOOT_COMPLETED的boot phase之前,该方法被调用的次数和引导阶段的次数一样多。每个阶段都是执行特定work,像获取可选的服务依赖,等待查看SafeMode是否使能,或者注册一个该服务之后启动的service。
Android 12支持的Boot_Phase包含7种,分别为
(1) public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100;
当onBootPhase(int) 回调的参数为100时,该boot_phase是系统在on boot时发给系统服务的最早的boot_phase。
(2) public static final int PHASE_LOCK_SETTINGS_READY = 480;
当onBootPhase(int) 回调的参数为480时,该boot_phase表示service可以获取锁定settings数据。
(3) public static final int PHASE_SYSTEM_SERVICES_READY = 500;
收到这个启动阶段后,service可以安全地调用核心的系统服务,例如PowerManager、PackageManager等。
(4) public static final int PHASE_DEVICE_SPECIFIC_SERVICES_READY = 520;
收到这个启动阶段后,service
可以调用
device的特殊服务
(5) public static final int PHASE_ACTIVITY_MANAGER_READY = 550;
收到这个启动阶段后,service可以广播intents。
(6) public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600;
收到这个启动阶段后,service可以start/bind第三方App。
(7) public static final int PHASE_BOOT_COMPLETED = 1000;
收到这个启动阶段,意味着启动已经完成,home application已经启动。系统services可以使用该阶段来降低总体延迟,这个回调和注册
ACTION_LOCKED_BOOT_COMPLETED广播是一样的。
二、成员函数
1. onStart()
public abstract void onStart(),抽象方法,extends SystemService的类必须实现该方法,并在该方法中调用publishBinderService()。
2.
onBootPhase(int phase)
public void onBootPhase(int phase){},它是一个空方法。boot进程的每个阶段都会调用该方法,可以根据参数phase做相应的work。
3. publishBinderService(String name, IBinder service)
protected final void publishBinderService(String name, IBinder service),公开该service,这样其他services和apps就可以访问到它。
该方法实际上是调用ServiceManager.addService(name, service allowIsolated, dumpPriority)。
4. getBinderService(String name)
protected final IBinder getBinderService(String name),根据name获取binder service。
该方法实际上是调用ServiceManager.getService(name)。
5. publishLocalService(Class<T> type, T service)
该方法实际上是调用LocalService.addService(type, service)。
6. getLocalService(Class<T> type)
该方法实际上是调用LocalService.getService(type)。
7. boolean isSafeMode()
返回SystemServiceManager的isSafeMode()的状态。