今天因为数据图标显示的一个小问题看了一下CDMA-GSM网络模式切换涉及到的一些动作,看得脑袋都晕了,赶快记下来(因为是从log分析出来的,可能不同的手机流程上可能会有所不同)
调用setPreferredNetworkType后,底层分别会上报一些消息分别是:
1、UNSOL_RESPONSE_CALL_STATE_CHANGED:如果正在打电话,电话会被挂断,会去getCurrentCallList,然后应用来处理
2、UNSOL_RESPONSE_NETWORK_STATE_CHANGED:会去查询network service状态及net type等并更新,但是因为data connect的状态变化的消息还没有上来,所以这时候data connect的状态仍然是CONNECTED。
重点关注一下net type:会从HSPA -> EDGE或者EDGE-> HSPA,在pollStateDone里面会 phone.notifyLocationChanged(),新的net type,旧的data connect这就是数据图标会闪一下的原因。这个问题在Framework层很难修改,或者可以考虑在应用中处理一下:切换网络之前先断掉数据连接,然后再去切换网络模式;或者底层上报的消息顺序能不能有所改动,让UNSOL_DATA_CALL_LIST_CHANGED先于UNSOL_RESPONSE_NETWORK_STATE_CHANGED上报,不过底层修改可能也很难。
3、UNSOL_DATA_CALL_LIST_CHANGED:这里有一个特别重要的接口onPdpStateChanged,当data connect状态是CONNECTED但是active又变成0了,会认为数据有可能断开了,但是又不是很确定,所以会去查一下:getPDPContextList,查询结果如果active还是0,那就会去断开连接,重新拨号。
补充:
1、 从log里可以看到多个UNSOL_DATA_CALL_LIST_CHANGED但只做了一次重新拨号,是因
为第二个消息上报的时候已经不满足if (state == State.CONNECTED)的条件了。
2、 cleanUpConnection(boolean tearDown, String reason)什么时候会断开后重新拨号,其实
是参数reason决定的。

