android 6.0的TELECOM_SERVICE的由来

2016-06-24  本文已影响1991人  wbxjack

起因

android 5.0之前是,Phone进程对外的服务都是通过TelephonyManager来实现的。现在多出来了个TelecomManager来给应用调用电话相关的功能。所以要看看,这个TelecomManager是何方神圣。

使用举例

  1. initializeTelecomSystem里面生成了TelecomSystem对象,在TelecomSystem的构造函数里面,创建了CallsManager/TelecomServiceImpl/CallIntentProcessor/PhoneAccountRegistrar/MissedCallNotifier等重要的telecom实例。
  2. getTelecomSystem().getTelecomServiceImpl().getBinder():实际就是得到了packages/services/Telecomm/src/com/android/server/telecom/TelecomServiceImpl.java中的mBinderImpl
    private final ITelecomService.Stub mBinderImpl = new ITelecomService.Stub() {
    @Override
    public PhoneAccountHandle getDefaultOutgoingPhoneAccount(String uriScheme,
    String callingPackage) {
    synchronized (mLock) {
    if (!canReadPhoneState(callingPackage, "getDefaultOutgoingPhoneAccount")) {
    return null;
    }
    ....

问题:什么时候完成发生的启动TelecomService的?

回答:系统启动时SystemServer(frameworks/base/services/java/com/android/server/SystemServer.java)会启动TelecomLoaderService。
mSystemServiceManager.startService(TelecomLoaderService.class);
当系统回调onBootPhase的时候,就会调用connectToTelecom函数去启动TelecomService。
@Override
public void onBootPhase(int phase) {
if (phase == PHASE_ACTIVITY_MANAGER_READY) {
registerDefaultAppNotifier();
registerCarrierConfigChangedReceiver();
connectToTelecom();
}
}

感受:

Google为了弄个用户用的TelecomManager居然搞了这么大的一圈。其实,这就是分层的设计理念。不同层次的调用对应不同的方法。
另外,通过分析也知道了CallsManager等相关函数的创建点。总之,收获满满。

上一篇 下一篇

猜你喜欢

热点阅读