1. android启动系统服务的方式
- 第一种方式:
mSystemServiceManager.startService(PowerManagerService.class)
该方式用于启动继承于SystemService的服务。主要功能包含创建serviceClass的对象,将刚创建的对象添加到SystemServiceManager的成员变量mServices,再调用刚创建对象的onStart()方法。对于服务启动到一定阶段,进入相应的Phase时,会调用SystemServiceManager的startBootPhase()回调方法,该方法会循环遍历所有向SystemServiceManager注册过的onBootPhase()方法。
- 第二种方式:
ServiceManager.addService("telephony.registry", telephonyRegistry);
改方式用于初始化继承于IBinder的服务。主要功能包含将服务向Native层的ServiceManager注册服务。
2. SystemService的生命周期
- 调用带有context的构造函数,用于初始化系统的服务
- 调用onStart()方法,来启动服务运行,该服务应该在此处调用publishBinderService(String,IBinder)方法来发布其绑定的接口。当然它也可能发布额外的本地接口,系统服务器内的其他服务可以调用这些本地服务来访问其内部
- 多次调用onBootPhase,直到PHASE_BOOT_COMPLETED被发送,这是最后一次启动阶段的标志。每个阶段都要进行特定的工作。例如获取可选的服务依赖关系、查看是否启动了SafeMode、或者注册一个依赖该服务启动后的服务
- 所有生命周期的方法都是从系统服务的主循环线程调用的
3. onBootPhase的阶段
Phase | Comments |
---|---|
PHASE_WAIT_FOR_DEFAULT_DISPLAY | 等待显示阶段 |
PHASE_LOCK_SETTINGS_READY | 锁定阶段:在此阶段,service就可以获得锁定的设置数据 |
PHASE_SYSTEM_SERVICES_READY | 系统服务准备就绪阶段:在此阶段,service可以安心的调用核心系统服务,比如PowerManager或者PackageManager |
PHASE_ACTIVITY_MANAGER_READY | AMS准备就绪阶段:在启动阶段后,service就可以发送广播了 |
PHASE_THIRD_PARTY_APPS_CAN_START | 启动第三方应用阶段:在启动阶段后,服务就可以启动/绑定第三方应用程序App就可以。并在此时调用Binder服务 |
PHASE_BOOT_COMPLETED | 启动结束阶段:在此阶段,此时服务可以运行用户与设备进行交互。当启动完成后Home应用程序会在此阶段启动。系统服务可能会监听这个阶段,而不是注册ACTION_BOOT_COMPLETED的广播接收器来减少整体延迟 |
4. onBootPhase启动的流程
SystemServiceManager的startBootPhase()贯穿system_server进程的整个启动过程
网友评论