关于ServiceStateTracker.java中setPowerStateToDesired函数的疑问
2010-05-29 15:34
267 查看
该函数在关闭radio或者说打开飞行模式的时候,会调用到。。原来源代码,如下。
@Override
protected void setPowerStateToDesired() {
// If we want it on and it's off, turn it on
if (mDesiredPowerState
&& cm.getRadioState() == CommandsInterface.RadioState.RADIO_OFF) {
cm.setRadioPower(true, null);
} else if (!mDesiredPowerState && cm.getRadioState().isOn()) {
DataConnectionTracker dcTracker = phone.mDataConnection;
if (! dcTracker.isDataConnectionAsDesired()) {
EventLog.List val = new EventLog.List(
dcTracker.getStateInString(),
(dcTracker.getAnyDataEnabled() ? 1 : 0) );
EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_DATA_STATE_RADIO_OFF, val);
}
Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_CONNECTION);
msg.arg1 = 1; // tearDown is true
msg.obj = CDMAPhone.REASON_RADIO_TURNED_OFF;
dcTracker.sendMessage(msg);
// Poll data state up to 15 times, with a 100ms delay
// totaling 1.5 sec. Normal data disable action will finish in 100ms.
for (int i = 0; i < MAX_NUM_DATA_STATE_READS; i++) {
DataConnectionTracker.State currentState = dcTracker.getState();
if (currentState != DataConnectionTracker.State.CONNECTED
&& currentState != DataConnectionTracker.State.DISCONNECTING) {
if (DBG) log("Data shutdown complete.");
break;
}
SystemClock.sleep(DATA_STATE_POLL_SLEEP_MS);
}
// If it's on and available and we want it off..
cm.setRadioPower(false, null);
} // Otherwise, we're in the desired state
}
在项目实际过程中,发现红色部分是有问题的。GSM模块没有发现问题,在CDMA中出现了问题。
在高通6085模块中,每当PPP拨号时,我们去打开飞行模式,发送AT+CFUN=0时,返回+CME ERROR:36。
其实,该函数的原意是很明确的,即当数据通道Connection的时候,我们需要先断开数据连接,然后才radio power off。
/*Send message to clean up connection*/
Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_CONNECTION);
msg.arg1 = 1; // tearDown is true
msg.obj = CDMAPhone.REASON_RADIO_TURNED_OFF;
dcTracker.sendMessage(msg);
但是按照源代码,这个clean up connection操作根本就不可能有时间执行。
后面这段代码的废的。。也就是根本就没有
clean up connection,就直接
cm.setRadioPower(false, null)了。
导致
发送AT+CFUN=0时,返回+CME ERROR:36。
@Override
protected void setPowerStateToDesired() {
// If we want it on and it's off, turn it on
if (mDesiredPowerState
&& cm.getRadioState() == CommandsInterface.RadioState.RADIO_OFF) {
cm.setRadioPower(true, null);
} else if (!mDesiredPowerState && cm.getRadioState().isOn()) {
DataConnectionTracker dcTracker = phone.mDataConnection;
if (! dcTracker.isDataConnectionAsDesired()) {
EventLog.List val = new EventLog.List(
dcTracker.getStateInString(),
(dcTracker.getAnyDataEnabled() ? 1 : 0) );
EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_DATA_STATE_RADIO_OFF, val);
}
Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_CONNECTION);
msg.arg1 = 1; // tearDown is true
msg.obj = CDMAPhone.REASON_RADIO_TURNED_OFF;
dcTracker.sendMessage(msg);
// Poll data state up to 15 times, with a 100ms delay
// totaling 1.5 sec. Normal data disable action will finish in 100ms.
for (int i = 0; i < MAX_NUM_DATA_STATE_READS; i++) {
DataConnectionTracker.State currentState = dcTracker.getState();
if (currentState != DataConnectionTracker.State.CONNECTED
&& currentState != DataConnectionTracker.State.DISCONNECTING) {
if (DBG) log("Data shutdown complete.");
break;
}
SystemClock.sleep(DATA_STATE_POLL_SLEEP_MS);
}
// If it's on and available and we want it off..
cm.setRadioPower(false, null);
} // Otherwise, we're in the desired state
}
在项目实际过程中,发现红色部分是有问题的。GSM模块没有发现问题,在CDMA中出现了问题。
在高通6085模块中,每当PPP拨号时,我们去打开飞行模式,发送AT+CFUN=0时,返回+CME ERROR:36。
其实,该函数的原意是很明确的,即当数据通道Connection的时候,我们需要先断开数据连接,然后才radio power off。
/*Send message to clean up connection*/
Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_CONNECTION);
msg.arg1 = 1; // tearDown is true
msg.obj = CDMAPhone.REASON_RADIO_TURNED_OFF;
dcTracker.sendMessage(msg);
但是按照源代码,这个clean up connection操作根本就不可能有时间执行。
后面这段代码的废的。。也就是根本就没有
clean up connection,就直接
cm.setRadioPower(false, null)了。
导致
发送AT+CFUN=0时,返回+CME ERROR:36。
相关文章推荐
- Android Application-Telephony-RIL 4 TelephonyManager to GSMServiceStateTracker
- Android关于AutoService、Javapoet讲解
- 关于Java中JComboBox 的itemStateChanged事件执行两次的解释
- 初学者的疑问:关于java引用类型标识符
- 关于Java线程状态转换中的wait()被唤醒时进入的状态的疑问
- Android4.4 Telephony流程分析——GsmServiceStateTracker管理网络服务状态
- Java 多线程中关于 ExecutorService 和 CompletionService的讨论
- 关于ASP.NET State service状态服务的问题
- 关于Java equals()方法的几点疑问
- 关于Java String对象创建的几点疑问
- ServiceStateTracker与RIL对象的交互
- 关于JAVA接口中的疑问
- Java关于"\t"制表符对齐的疑问
- 关于javabean中get和set作用的疑问
- 关于java垃圾回收的一个疑问
- 关于Reporting Service中的Report builder的几个疑问,高手来解答下
- 【Java 并发】关于中断的几个疑问
- 关于JavaService的相关技术文档链接
- 关于onreadystatechange属性的一点疑问
- 关于 C# 调用 JavaWebservice服务,版本不一致的问题