您的位置:首页 > 理论基础 > 计算机网络

android 6.0 优先网络类型设置流程(Preferrred network type)

2018-03-01 15:26 1911 查看
本文主要介绍在settings –> Mobile network –> Preferred network type 选择某个网络类型的流程

整体流程图


重点代码分析

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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: