本文基于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