这段时间,在研究Telephony相关的通话流程,虽然从书上看到通话流程,但是自己在分析Google 8.0的代码的时候,发现依旧有些复杂,现在就将自己的研究成果记录一下,以备后续查阅。
一.TelecomLoaderService的初始化
1)调用SystemServiceManager的startService方法,传入的参数就是TelecomLoaderService的class,而这个startService方法,此前也分析过,就是先调用传入class参数的有参构造方法(参数为Context),然后将传入的class参数加入到SystemServiceManager的mService中
进行管理,最后调用传入参数的onStart方法
2)调用SystemServiceManager的startBootPhase方法,传入的参数为SystemService.PHASE_ACTIVITY_MANAGER_READY,而此方法主要是调用加入SystemServiceManager的mService中的所有service的onBootPhase方法,即会调用TelecomLoaderService的onBootPhase方法
一.TelecomLoaderService的初始化
在此前的Android机器启动的流程中,分析过,SystemServer中启动系统的所有服务和进程,而在此文件中,我们会发现,TelecomLoaderService的初始化
private void startOtherServices() {
......
mSystemServiceManager.startService(TelecomLoaderService.class);
......
mSystemServiceManager.startBootPhase(SystemService.PHASE_ACTIVITY_MANAGER_READY);
......
}
从上面的代码中,可以看到,在SystemServer中做了如下的事情
1)调用SystemServiceManager的startService方法,传入的参数就是TelecomLoaderService的class,而这个startService方法,此前也分析过,就是先调用传入class参数的有参构造方法(参数为Context),然后将传入的class参数加入到SystemServiceManager的mService中
进行管理,最后调用传入参数的onStart方法
2)调用SystemServiceManager的startBootPhase方法,传入的参数为SystemService.PHASE_ACTIVITY_MANAGER_READY,而此方法主要是调用加入SystemServiceManager的mService中的所有service的onBootPhase方法,即会调用TelecomLoaderService的onBootPhase方法
接下来,我们就查看一下
(一)TelecomLoaderService的构造方法
public TelecomLoaderService(Context context) {
super(context);
mContext = context;
registerDefaultAppProviders();
}
调用了registerDefaultAppProviders方法
private void registerDefaultAppProviders() {
final PackageManagerInternal packageManagerInternal = LocalServices.getService(
PackageManagerInternal.class);
// Set a callback for the package manager to query the default sms app.
packageManagerInternal.setSmsAppPackagesProvider(...);
// Set a callback