Android(安卓)7.1 双卡双待机器,首选网络类型设置 详细分析
16lz
2021-01-26
首次由preferred_network_mode转换成preferred_network_mode1和preferred_network_mode2是在SubscriptionInfoUpdater类中的handleSimLoaded方法
我们机器设备默认的是: [ro.telephony.default_network]: [22,20]
但是双sim卡,会对网络进行设置,会有一个设置的过程: 类->方法流程 click选择某张运营商卡为主卡: IExtTelephony extTelephony = IExtTelephony.Stub.asInterface(ServiceManager.getService("extphone")); extTelephony.setPrimaryCardOnSlot(targetSub);
调用ExtTelephony的setPrimaryCardOnSlot方法 -》ExtTelephonyServiceImpl -》setPrimaryCardOnSlot() -》QtiPrimaryCardController.getInstance().setPrimaryCardOnSlot(slotId); -》QtiPrimaryCardController -》setPrimaryCardOnSlot() -》synchronized private void setPrimaryCardOnSlot(int primarySlotId, Message msg) -》在setPrimaryCardOnSlot方法中:
mPrefNwModes = mPriorityHandler.getNwModesFromConfig(primarySlotId); //通过getNwModesFromConfig获取两种网络模式
for (int i = 0; i < QtiPrimaryCardUtils.PHONE_COUNT; i++) { saveNwModesToDB(mPrefNwModes[i], i); //保存到数据库重要的一步 }
-》QtiPrimaryCardPriorityHandler -》getNwModesFromConfig() -》
for (int i = 0; i < QtiPrimaryCardUtils.PHONE_COUNT; i++) { if (mCurrPriorityConfigs[i] != null) { prefNwModes[i] = (i == primarySlotId) ? mCurrPriorityConfigs[i].network1 : mCurrPriorityConfigs[i].network2; //获取该类中的mCurrPriorityConfigs的network1和network2 } else { prefNwModes[i] = defaultNwMode; } }
-》而mCurrPriorityConfigs的计算和获取是通过: -》loadCurrentPriorityConfigs() -》
public void loadCurrentPriorityConfigs(boolean override) { if(!mLoadingConfigCompleted) { logd("getPrefPrimarySlot: All Config Loading not done. EXIT!!!"); return; }
if(override || !mLoadingCurrentConfigsDone) { //get Current Priority config applicable for each slot for (int i = 0; i < QtiPrimaryCardUtils.PHONE_COUNT; i++) { mCurrPriorityConfigs[i] = getPriorityConfig(i); } mLoadingCurrentConfigsDone = true; } }
-》getPriorityConfig() -》PriorityConfig pConfig = mAllPriorityConfigs.get(i); -》 private HashMap mAllPriorityConfigs = new HashMap(); 从mAllPriorityConfigs 这个HashMap中来 -》在初始化的时候: QtiPrimaryCardPriorityHandler(Context context){ mContext = context;
mCurrPriorityConfigs = new PriorityConfig[QtiPrimaryCardUtils.PHONE_COUNT]; tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
readPriorityConfigFromXml(); } -》readPriorityConfigFromXml() -》 private void readPriorityConfigFromXml() { XmlResourceParser parser = null; try { Resources res = mContext.getPackageManager().getResourcesForApplication(packageName); if (res == null) loge("res is null"); int resId = res.getIdentifier(QtiPrimaryCardUtils.getConfigXml(), "xml", packageName); parser = res.getXml(resId); //Clear all old configs from hash map. mAllPriorityConfigs.clear(); mPriorityCount = 0;
XmlUtils.beginDocument(parser, "priority_config"); //2TODO: here we can read the operator config and feed it to pcutils XmlUtils.nextElement(parser); while (parser.getEventType() != XmlPullParser.END_DOCUMENT) { savePriorityConfig(parser); XmlUtils.nextElement(parser); } mLoadingConfigCompleted = true; } catch (Exception e) { Rlog.e(LOG_TAG, "Exception while reading priority configs: " + e.getMessage(), e); mLoadingConfigCompleted = false; } finally { logi("mAllPriorityConfigs: " + mAllPriorityConfigs); if (parser != null) { parser.close(); } } } -》是从QtiPrimaryCardUtils.getConfigXml()中读取xml文件
-》xml的文件名分别是: public static String getConfigXml() { if (isBitSetInConfig(ConfigBits.PRIORITY_CONFIG_3)) { return "priority_config_3"; } else if (isBitSetInConfig(ConfigBits.PRIORITY_CONFIG_2)) { return "priority_config_2"; } else if (isBitSetInConfig(ConfigBits.PRIORITY_CONFIG_1)) { return "priority_config_1"; } return "priority_config_2"; }
-》打开xml文件:
config_3:
config_2:
config_1:
我们机器设备默认的是: [ro.telephony.default_network]: [22,20]
但是双sim卡,会对网络进行设置,会有一个设置的过程: 类->方法流程 click选择某张运营商卡为主卡: IExtTelephony extTelephony = IExtTelephony.Stub.asInterface(ServiceManager.getService("extphone")); extTelephony.setPrimaryCardOnSlot(targetSub);
调用ExtTelephony的setPrimaryCardOnSlot方法 -》ExtTelephonyServiceImpl -》setPrimaryCardOnSlot() -》QtiPrimaryCardController.getInstance().setPrimaryCardOnSlot(slotId); -》QtiPrimaryCardController -》setPrimaryCardOnSlot() -》synchronized private void setPrimaryCardOnSlot(int primarySlotId, Message msg) -》在setPrimaryCardOnSlot方法中:
mPrefNwModes = mPriorityHandler.getNwModesFromConfig(primarySlotId); //通过getNwModesFromConfig获取两种网络模式
for (int i = 0; i < QtiPrimaryCardUtils.PHONE_COUNT; i++) { saveNwModesToDB(mPrefNwModes[i], i); //保存到数据库重要的一步 }
-》QtiPrimaryCardPriorityHandler -》getNwModesFromConfig() -》
for (int i = 0; i < QtiPrimaryCardUtils.PHONE_COUNT; i++) { if (mCurrPriorityConfigs[i] != null) { prefNwModes[i] = (i == primarySlotId) ? mCurrPriorityConfigs[i].network1 : mCurrPriorityConfigs[i].network2; //获取该类中的mCurrPriorityConfigs的network1和network2 } else { prefNwModes[i] = defaultNwMode; } }
-》而mCurrPriorityConfigs的计算和获取是通过: -》loadCurrentPriorityConfigs() -》
public void loadCurrentPriorityConfigs(boolean override) { if(!mLoadingConfigCompleted) { logd("getPrefPrimarySlot: All Config Loading not done. EXIT!!!"); return; }
if(override || !mLoadingCurrentConfigsDone) { //get Current Priority config applicable for each slot for (int i = 0; i < QtiPrimaryCardUtils.PHONE_COUNT; i++) { mCurrPriorityConfigs[i] = getPriorityConfig(i); } mLoadingCurrentConfigsDone = true; } }
-》getPriorityConfig() -》PriorityConfig pConfig = mAllPriorityConfigs.get(i); -》 private HashMap
mCurrPriorityConfigs = new PriorityConfig[QtiPrimaryCardUtils.PHONE_COUNT]; tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
readPriorityConfigFromXml(); } -》readPriorityConfigFromXml() -》 private void readPriorityConfigFromXml() { XmlResourceParser parser = null; try { Resources res = mContext.getPackageManager().getResourcesForApplication(packageName); if (res == null) loge("res is null"); int resId = res.getIdentifier(QtiPrimaryCardUtils.getConfigXml(), "xml", packageName); parser = res.getXml(resId); //Clear all old configs from hash map. mAllPriorityConfigs.clear(); mPriorityCount = 0;
XmlUtils.beginDocument(parser, "priority_config"); //2TODO: here we can read the operator config and feed it to pcutils XmlUtils.nextElement(parser); while (parser.getEventType() != XmlPullParser.END_DOCUMENT) { savePriorityConfig(parser); XmlUtils.nextElement(parser); } mLoadingConfigCompleted = true; } catch (Exception e) { Rlog.e(LOG_TAG, "Exception while reading priority configs: " + e.getMessage(), e); mLoadingConfigCompleted = false; } finally { logi("mAllPriorityConfigs: " + mAllPriorityConfigs); if (parser != null) { parser.close(); } } } -》是从QtiPrimaryCardUtils.getConfigXml()中读取xml文件
-》xml的文件名分别是: public static String getConfigXml() { if (isBitSetInConfig(ConfigBits.PRIORITY_CONFIG_3)) { return "priority_config_3"; } else if (isBitSetInConfig(ConfigBits.PRIORITY_CONFIG_2)) { return "priority_config_2"; } else if (isBitSetInConfig(ConfigBits.PRIORITY_CONFIG_1)) { return "priority_config_1"; } return "priority_config_2"; }
-》打开xml文件:
config_3:
config_2:
config_1:
更多相关文章
- [forward]Android完全退出应用程序
- 如何下载并编译Android内核源码goldfish(图文)
- Cocos2d-x微信登陆Demo
- java中采用Pull解析器对XML文件进行解析
- Android(安卓)background背景图片平铺
- Android(安卓)-- 使用OKhttp获取response时遇到的坑
- Android系统文件目录结构
- Android开发学习之View测量的内置常用方法
- android addr2line使用