android 6.0 优先网络类型设置流程(Preferrred network type)
2018-03-01 15:26
1911 查看
本文主要介绍在settings –> Mobile network –> Preferred network type 选择某个网络类型的流程
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
通过判断CarrierConfigManager.KEY_WORLD_PHONE_BOOL的值来确定当我们点击Preferred network type选项后显示含global还是不含global的选项界面。2、往下设置网络类型
2
3
4
5
6
7
8
9
10
11
12
13
14
15
通过判断当前应该显示的preference以及设置的网络类型和当前网络类型是否一样,如果不一样往下设置选择的网络类型3、判断是否含有高通的PhoneFeature
2
3
4
5
6
7
8
9
10
11
如果含有就通过高通的phonefeatures plugin的逻辑处理优先网络类型的设置流程(和原生的处理流程不太一样,它会先将一张卡设置为GSM only)4、通过bundle将消息发送出去
2
3
4
5
6
7
8
9
10
5、设置的具体流程
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
6、PhoneFeature处理逻辑(设置一张卡为GSM only)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
最后通过PrefNetworkRequest.request方调用QtiRadioCapabilityController.setPreferredNetworkType
方法进而向RIL下发设置命令
2
3
4
整体流程图
重点代码分析
1、是否包含global选项最开始执行MobileNetworkSettings.onCreate方法做一些初始化的操作,然后执行initializeSubscriptions确定两个Tab title和界面的显示,然后再执行updateBody方法,这里确定了每个Preference显示的内容,我们特别关心Preferred network type 这个选项,它的内容显示判断如下:else if (carrierConfig.getBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL) == true) { prefSet.removePreference(mButtonEnabledNetworks);//移除不含global的界面 // set the listener for the mButtonPreferredNetworkMode list preference so we can issue // change Preferred Network Mode. if (PRIMCARYCARD_L_W_ENABLED) { mButtonPreferredNetworkMode.setEntries( R.array.preferred_network_mode_choices); mButtonPreferredNetworkMode.setEntryValues( R.array.preferred_network_mode_values); } mButtonPreferredNetworkMode.setOnPreferenceChangeListener(this); mCdmaOptions = new CdmaOptions(this, prefSet, mPhone); mGsmUmtsOptions = new GsmUmtsOptions(this, prefSet, phoneSubId); } else { prefSet.removePreference(mButtonPreferredNetworkMode);//移除含global的界面 final int phoneType = mPhone.getPhoneType(); if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) { int lteForced = android.provider.Settings.Global.getInt( mPhone.getContext().getContentResolver(), android.provider.Settings.Global.LTE_SERVICE_FORCED + mPhone.getSubId(), 0);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
通过判断CarrierConfigManager.KEY_WORLD_PHONE_BOOL的值来确定当我们点击Preferred network type选项后显示含global还是不含global的选项界面。2、往下设置网络类型
else if (preference == mButtonEnabledNetworks) { mButtonEnabledNetworks.setValue((String) objValue); int buttonNetworkMode; buttonNetworkMode = Integer.valueOf((String) objValue).intValue(); if (DBG) log("buttonNetworkMode: " + buttonNetworkMode); int settingsNetworkMode = getPreferredNetworkModeForSubId();//获取当前系统网络类型 if (buttonNetworkMode != settingsNetworkMode) { if (modemNetworkMode < Phone.NT_MODE_WCDMA_PREF || modemNetworkMode > Phone.NT_MODE_TD_SCDMA_LTE_CDMA_EVDO_GSM_WCDMA) { loge("Invalid Network Mode (" + buttonNetworkMode + ") chosen. Ignore."); return true; } UpdateEnabledNetworksValueAndSummary(buttonNetworkMode);//更新界面 setPreferredNetworkType(modemNetworkMode); } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
通过判断当前应该显示的preference以及设置的网络类型和当前网络类型是否一样,如果不一样往下设置选择的网络类型3、判断是否含有高通的PhoneFeature
private void setPreferredNetworkType(int networkMode) { if (PhoneGlobals.getInstance().isPhoneFeatureEnabled()) { PhoneGlobals.getInstance().setPrefNetwork(mPhone.getPhoneId(), networkMode, mHandler.obtainMessage( MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE_BY_PLUGIN)); } else { // Set the modem network mode mPhone.setPreferredNetworkType(networkMode, mHandler.obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE)); } }1
2
3
4
5
6
7
8
9
10
11
如果含有就通过高通的phonefeatures plugin的逻辑处理优先网络类型的设置流程(和原生的处理流程不太一样,它会先将一张卡设置为GSM only)4、通过bundle将消息发送出去
public void setPrefNetwork(int sub, int network, Message callback) { if (callback != null) { callback.replyTo = new Messenger(callback.getTarget()); } Bundle params = new Bundle(); params.putInt(PhoneConstants.SLOT_KEY, sub); params.putInt("network", network); params.putParcelable("callback", callback); callBinder("set_pref_network", params);//设置处理类型在FeatureProvider中使用 }1
2
3
4
5
6
7
8
9
10
5、设置的具体流程
else if (METHOD_SET_PREF_NETWORK.equals(method) && extras != null) { //判断上面设置的类型 if (extras.containsKey(EXTRA_BAND)) { Intent bandSetIntent = new Intent(getContext(), FeatureService.class); bandSetIntent.setAction(FeatureService.ACTION_ENABLE_TDD_LTE); bandSetIntent.putExtras(extras); getContext().startService(bandSetIntent); } else { int slot = extras.getInt(PhoneConstants.SLOT_KEY, 0); int network = extras.getInt(EXTRA_NETWORK, Phone.NT_MODE_GSM_ONLY); Message message = (Message) extras.getParcelable(EXTRA_CALLBACK); PrefNetworkRequest request = new PrefNetworkRequest(getContext(), slot, network, message); //新建PrefNetworkRequest对象 if (extras.containsKey(EXTRA_ACQ_ORDER)) { request.setAcqOrder(extras.getInt(EXTRA_ACQ_ORDER, Constants.NW_ACQ_ORDER_LTE_TDS_GSM)); } request.loop(); //执行设置操作 } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
6、PhoneFeature处理逻辑(设置一张卡为GSM only)
public PrefNetworkRequest(Context context, int slot, int networkMode, Message callback) { super(sSyncQueue); mContext = context; mCallback = callback; commands = new ArrayList<PrefNetworkSetCommand>(); CardStateMonitor cardStateMonitor = AppGlobals.getInstance().mCardMonitor; int numCardsPresent = 0; for (int index = 0; index < Constants.PHONE_COUNT; index++) { if (cardStateMonitor.getCardInfo(index).isCardPresent()) { numCardsPresent++; } } if (networkMode != Phone.NT_MODE_GSM_ONLY && (numCardsPresent == 1 || !context.getResources().getBoolean(R.bool.feature_global_on_msim))) { for (int index = 0; index < Constants.PHONE_COUNT; index++) { if (index != slot) //设置另一张卡为GSM only commands.add(new PrefNetworkSetCommand(index, Phone.NT_MODE_GSM_ONLY)); } } if (slot >= 0 && slot < Constants.PHONE_COUNT) { commands.add(new PrefNetworkSetCommand(slot, networkMode)); //设置当前卡为传入的状态 } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
最后通过PrefNetworkRequest.request方调用QtiRadioCapabilityController.setPreferredNetworkType
方法进而向RIL下发设置命令
logd("set " + command.mPrefNetwork + " for slot" + command.mSlot); AppGlobals.getInstance().mPhones[command.mSlot].setPreferredNetworkType( command.mPrefNetwork, mHandler.obtainMessage(EVENT_SET_PREF_NETWORK_DONE, index));1
2
3
4
重要的log信息
//界面命令下发 Line 10672: 07-07 13:35:56.273 10837 10837 D NetworkSettings: getPreferredNetworkModeForPhoneId: phoneNwMode = 3 phoneId = 0 Line 10676: 07-07 13:35:56.275 10837 10837 D NetworkSettings: getPreferredNetworkModeForPhoneId: phoneNwMode = 3 phoneId = 0 Line 11819: 07-07 13:36:11.373 10837 10837 D NetworkSettings: getPreferredNetworkModeForPhoneId: phoneNwMode = 1 phoneId = 0 Line 11823: 07-07 13:36:11.374 10837 10837 D NetworkSettings: getPreferredNetworkModeForPhoneId: phoneNwMode = 1 phoneId = 0 //中间命令下发 Line 10454: 07-07 13:35:56.124 10837 10837 D pref_network_request: try to set network=3, acq=null, band=null on slot0 Line 10455: 07-07 13:35:56.133 10837 10837 D pref_network_request: set 1 for slot1 Line 10456: 07-07 13:35:56.138 10837 10837 D pref_network_request: set 1 for slot1 done, null Line 10457: 07-07 13:35:56.151 10837 10837 D pref_network_request: set 3 for slot0 Line 10599: 07-07 13:35:56.210 10837 10837 D pref_network_request: set 3 for slot0 done, null Line 11765: 07-07 13:36:11.285 10837 10837 D pref_network_request: try to set network=1, acq=null, band=null on slot0 Line 11767: 07-07 13:36:11.302 10837 10837 D pref_network_request: set 1 for slot0 Line 11768: 07-07 13:36:11.324 10837 10837 D pref_network_request: set 1 for slot0 done, null //往RIL下发命令 Line 8819: 07-07 13:35:56.133 10837 10837 D QtiRadioCapabilityController: setPreferredNetworkType: nwMode[1] = 1 isActive = false Line 8825: 07-07 13:35:56.152 10837 10837 D QtiRadioCapabilityController: setPreferredNetworkType: nwMode[0] = 3 isActive = true //RIL下发指令 Line 8821: 07-07 13:35:56.133 10837 10837 D RILJ : [3812]> REQUEST_SET_PREFERRED_NETWORK_TYPE : 1 [SUB1] Line 8833: 07-07 13:35:56.154 10837 10837 D RILJ : [3813]> REQUEST_SET_PREFERRED_NETWORK_TYPE : 3 [SUB0]
相关文章推荐
- android 6.0 优先网络类型设置流程(Preferrred network type)
- How to get camped network type name - Android应用如何获得Phone当前注册的网络类型
- Android中设置Ethernet为默认网络类型
- android网络类型 wap代理设置
- android网络类型 wap代理设置
- Android手机网络NetWorkType对应的常量值
- Android中设置Ethernet为默认网络类型
- Android之设置EditText输入类型(setInputType()方法和android:inputType属性)
- android网络类型 wap代理设置
- Android之设置EditText输入类型(setInputType()方法和android:inputType属性)
- android网络类型 wap代理设置
- Android中设置Ethernet为默认网络类型
- Android中设置Ethernet为默认网络类型
- Android settings使用详解之设置优先网络
- Android手机网络NetWorkType对应的常量值
- android:inputType设置文本类型
- OSPF Unicast Multicast and Network Type(OSPF的单播多播与网络类型辩析)
- android 铃声设置流程讲解
- 【转】Android 的cpu 硬盘 内存 网络设置 系统信息 硬件信息
- Android 判断网络状态,并且在没有网络的时候,打开网络设置对话框