拨号流程分析(第五篇)

本文详细分析了Android 8.0系统中拨号流程,从IConnectionService服务响应、TeleService拨号流程、RIL真机调试日志、TelecomAdapter接收消息回调等方面进行深入探讨。拨号流程涉及多个代码库和服务,包括Dialer、Telecom、Telephony和RIL,通过Handler实现异步处理,并在RIL层完成硬件交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文基于Android 8.0

IConnectionService服务的响应过程

根据AndroidManifest.xml中对android.telecom.ConnectionService服务的定义,其服务的Java类为com.android.services.telephony.TelephonyConnectionService ,继承自android.telecom.ConnectionService抽象类。 在 frameworks/base工程下,代码文件为frameworks/base/telecomm/java/android/telecom/ConnectionService.java ,其服务响应的关键逻辑简化后的代码框架详情如下:

public abstract class ConnectionService extends Service {
   
	...
	private final IBinder mBinder = new IConnectionService.Stub() {
   
		// addConnectionServiceAdapter、createConnection、answer、hold
	}
	...
	@Override
    public final IBinder onBind(Intent intent) {
   
        return mBinder;
    }
}

frameworks/base/telecomm/java/com/android/internal/telecom/IConnectionService.aidl文件作为IConnectionService服务的接口定义,主要定义了addConnectionServiceAdapter、CreateConnection、answer、hold等接口。通过这些接口的名字,可以知道此服务主要提供了Call状态管理的接口供Telecom应用调用 , 比如接昕电话、保持呼叫、挂断电话等 。

Telecom应用的ConnectionServiceWrapper对象在拨号流程中,首先绑定服务,接着调用服务的addConnectionServiceAdapter和 CreateConnection接口。 TelephonyConnectionService服务的响应逻辑是什么呢?接下来,我们分别从 IConnectionService的 onBind、addConnectionServiceAdapter和createConnection服务接口加以解析。

1. onBind服务被绑定的响应方法

TelephonyConnectionService继承于ConnectionService类,并未重写父类的onBind方法 。onBind逻辑简单,返回了IConnectionService.Stub类型的mBinder对象

2. addConnectionServiceAdapter设置Adapter
// 使用Handler的异步消息处理机制,将服务调用的同步方式转为异步方式处理,addConnectionServiceAdapter服务接口将立即返回
@Override
public void addConnectionServiceAdapter(IConnectionServiceAdapter adapter,
                Session.Info sessionInfo) {
   
     ...
     mHandler.obtainMessage(MSG_ADD_CONNECTION_SERVICE_ADAPTER, args).sendToTarget();
     ...
}

// 查看mHandler对消息MSG_ADD_CONNECTION SERVICE ADAPTER的响应逻辑
case MSG_ADD_CONNECTION_SERVICE_ADAPTER: {
   
    ...
    IConnectionServiceAdapter adapter = (IConnectionServiceAdapter) args.arg1;
    mAdapter.addAdapter(adapter);// mAdapter再嵌套一层Adapter
    onAdapterAttached();// 验证Adapter是否可用
    ...
}

addConnectionServiceAdapter接口的响应逻辑相对比较简单,我们只需重点关注使用 Handler的异步消息处理机制,将服务调用的同步方式转为异步处理即可,与lnCallService的处理机制相同

3. createConnection继续发送拨号请求

ConnectionService服务的接口CreateConnection的响应逻辑仍然是通过mHandler将同步调用转为异步处理。 mHandler发出MSG_ CREATE_CONNECTION消息,并在handleMessage中响应此方法 , 再调用父类的createConnection方法,此方法的 关键逻辑如下:

private void createConnection(
            final PhoneAccountHandle callManagerAccount,
            final String callId,
            final ConnectionRequest request,
            boolean isIncoming,
            boolean isUnknown) {
   
        // 将调用onCreateOutgoingConnection创建Connection对象,注意与ConnectionService的区别
        connection = isUnknown ? onCreateUnknownConnection(callManagerAccount, request)
                : isIncoming ? onCreateIncomingConnection(callManagerAccount, request)
                : onCreateOutgoingConnection(callManagerAccount, request);
    ... // 跨进程调用Telecom服务接口,通过Connection已经成功创建
    mAdapter.handleCreateConnectionComplete
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值