(N)Telephony分析(七)之DataConnection建立

本文深入探讨了Android系统中DataConnection的建立过程,从DcTracker的初始化开始,涉及ServiceStateTracker的EVENT_SIM_READY事件处理,接着分析RIL类的getDataRegistrationState方法,直至setupDataOnConnectableApns和setupData方法的调用,详细阐述了DataConnection建立的完整流程。

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

在前面,我们分析过DcTracker的初始化的时候,我们有看过,在DcTracker的构造方法中,调用有如下这个方法

private void registerForAllEvents() {
    mPhone.mCi.registerForAvailable(this, DctConstants.EVENT_RADIO_AVAILABLE, null);
    mPhone.mCi.registerForOffOrNotAvailable(this,
            DctConstants.EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
    mPhone.mCi.registerForDataNetworkStateChanged(this,
            DctConstants.EVENT_DATA_STATE_CHANGED, null);
    // Note, this is fragile - the Phone is now presenting a merged picture
    // of PS (volte) & CS and by diving into its internals you're just seeing
    // the CS data.  This works well for the purposes this is currently used for
    // but that may not always be the case.  Should probably be redesigned to
    // accurately reflect what we're really interested in (registerForCSVoiceCallEnded).
    mPhone.getCallTracker().registerForVoiceCallEnded(this,
            DctConstants.EVENT_VOICE_CALL_ENDED, null);
    mPhone.getCallTracker().registerForVoiceCallStarted(this,
            DctConstants.EVENT_VOICE_CALL_STARTED, null);
    registerServiceStateTrackerEvents();
 //   SubscriptionManager.registerForDdsSwitch(this,
 //          DctConstants.EVENT_CLEAN_UP_ALL_CONNECTIONS, null);
    mPhone.mCi.registerForPcoData(this, DctConstants.EVENT_PCO_DATA_RECEIVED, null);
}
其中有调用到registerServiceStateTrackerEvents方法

public void registerServiceStateTrackerEvents() {
	// Leo,注册DataConnectionAttached消息
    mPhone.getServiceStateTracker().registerForDataConnectionAttached(this,
            DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null);
    mPhone.getServiceStateTracker().registerForDataConnectionDetached(this,
            DctConstants.EVENT_DATA_CONNECTION_DETACHED, null);
    mPhone.getServiceStateTracker().registerForDataRoamingOn(this,
            DctConstants.EVENT_ROAMING_ON, null);
    mPhone.getServiceStateTracker().registerForDataRoamingOff(this,
            DctConstants.EVENT_ROAMING_OFF, null);
    mPhone.getServiceStateTracker().registerForPsRestrictedEnabled(this,
            DctConstants.EVENT_PS_RESTRICT_ENABLED, null);
    mPhone.getServiceStateTracker().registerForPsRestrictedDisabled(this,
            DctConstants.EVENT_PS_RESTRICT_DISABLED, null);
    mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(this,
            DctConstants.EVENT_DATA_RAT_CHANGED, null);
}
这样,就将当前的DcTracker和ServiceStateTracker绑定到一起了,我们看第一个注册消息EVENT_DATA_CONNECTION_ATTACHED,那么他是怎么激活接收的呢?

这个我么就要分析下ServiceStateTracker了,在SIM卡信息加载读取完成后,ServiceStateTracker会发出一个EVENT_SIM_READY消息,然后在其中进行处理

case EVENT_SIM_READY:
    // Reset the mPreviousSubId so we treat a SIM power bounce
    // as a first boot.  See b/19194287
    mOnSubscriptionsChangedListener.mPreviousSubId.set(-1);
    pollState();
    // Signal strength polling stops when radio is off
    queueNextSignalStrengthPoll();
    break;
恩,调用了pollState方法

public void pollState() {
    pollState(false);
}
public void pollState(boolean modemTriggered) {
    mPollingContext = new int[1];
    mPollingContext[0] 
### Android Telephony 数据连接建立过程详解 #### 1. RILD 和 RILJ 的交互 RILD 是 Android 系统中的一个守护进程,负责与手机基带进行底层通信。当应用程序发起数据连接请求时,RILD 接收来自 RILJ (Radio Interface Layer Java) 的请求并将这些请求转发给基带处理器[^3]。 #### 2. 请求传递至 Modem 层 一旦 RILD 收到来自上层的应用程序请求,会通过特定的协议栈将此请求发送到底层的调制解调器(Modem)。这个过程中涉及到了一系列复杂的硬件抽象层操作,最终使得物理链路得以激活并准备就绪。 #### 3. TelephonyManager 发起请求 `TelephonyManager` 类提供了访问电话服务的功能,在需要启动一个新的数据连接时,开发者可以通过 `TelephonyManager` 提供的相关方法来触发这一动作。例如: ```java // 获取默认订阅ID下的TelephonyManager实例 TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class); if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { // Handle permission request... } telephonyManager.createForSubscriptionId(subscriptionId).getDataEnabled(); // 查询当前状态 ``` 这段代码展示了如何获取 `TelephonyManager` 对象,并检查是否有权限读取设备信息;之后可以进一步控制数据开关的状态[^4]。 #### 4. 数据连接配置与初始化 在成功建立了到 modem 的指令传输路径后,接下来就是配置 IP 地址和其他必要的参数以完成整个 PDP 上下文设置。这一步骤通常是由操作系统自动处理,但也可以通过编程接口来进行定制化调整。 #### 5. 连接确认及维护 最后,当所有的准备工作完成后,系统会向应用程序反馈连接的结果——无论是成功还是失败。如果一切顺利,则意味着已经建立起有效的 GPRS/EDGE/LTE 等类型的无线广域网(WWAN)连接。在此期间,任何异常情况都会被记录下来以便后续排查问题所在。 #### 6. Telecom 框架的作用 值得注意的是,虽然上述流程主要围绕着传统意义上的蜂窝数据展开讨论,但在现代 Android 版本中,Telecom 框架也扮演着重要角色。该框架不仅限于管理基于 SIM 卡的传统语音通话,还涵盖了 VoIP 以及其他形式的多媒体通讯方式。对于那些希望创建自己版本拨号应用或提供额外增值服务的企业来说尤为关键[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值