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

本文主要介绍在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);

通过判断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);
        }
}

通过判断当前应该显示的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));
        }
    }

如果含有就通过高通的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中使用
    }

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(); //执行设置操作
            }
        }

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)); //设置当前卡为传入的状态
        }
    }

最后通过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));

重要的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]
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值