首先是界面,我在此平台的界面如下:
编辑
对应的入口源码位置在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层的流程就完成了
参考文档:
Android RIL介绍_ril android-CSDN博客