网络选择流程分析(首选网络类型切换流程)

160 阅读2分钟

 首先是界面,我在此平台的界面如下:

​编辑

对应的入口源码位置在Settings的UniEnabledNetworkModePreferenceController中,当然其他平台可能在PreferredNetworkModePreferenceController中,流程上都是大同小异

然后点击切换按钮会调用到UniEnabledNetworkModePreferenceController的onPreferenceChange方法

​编辑

这里主要看如下代码:

boolean isSucceed = mTelephonyManager.setPreferredNetworkTypeBitmask(

                        MobileNetworkUtils.getRafFromNetworkType(newPreferredNetworkMode));

然后调用到TelephonyManager中的setPreferredNetworkTypeBitmask方法中

​编辑

此方法通过aidl调用到PhoneInterfaceManager中的setAllowedNetworkTypesForReason方法中

​编辑

然后主要看此方法的如下代码:

 Boolean success = (Boolean) sendRequest(
CMD_SET_ALLOWED_NETWORK_TYPES_FOR_REASON,                     
new Pair<Integer, Long>(reason, allowedNetworkTypes), subId);

然后回调用到此类的如下代码中:

​编辑

如上方法是调用到Phone.java中的setAllowedNetworkTypes方法中

​编辑

此方法中主要看圈出来的三个方法

1.SubscriptionManager.setSubscriptionProperty是更新数据库操作,将我们的更换网络首选项的信息更新到数据库

2.updateAllowedNetworkTypes是真正与底层通信实现网络首选项功能的

3.notifyAllowedNetworkTypesChanged是通知界面进行更行的

所以我们这里继续分析updateAllowedNetworkTypes方法

​编辑

在如上方法中调用了mCi.setAllowedNetworkTypesBitmap(filteredRaf, response);

此方法最终会调用到RIL.java中

​编辑

然后是调用到ril_service.cpp中

​编辑

最后会调用到reference-ril.c中的如下方法

​编辑

此方法就是向Modem中发送指令,至此从应用层到framework层到Modem层的流程就完成了

参考文档:

www.cnblogs.com/wuhen1024/p…

Android RIL介绍_ril android-CSDN博客