(N)Telephony分析(五)之DcTracker的初始化

本文详细介绍了DcTracker的初始化过程,包括UiccController、AlarmManager、ConnectivityManager的初始化,设置UserDataEnabled,AutoAttachOnCreation的配置,SubscriptionManager的初始化,事件注册,ApnContext与Emergency APN的创建,以及观察者的注册。这些步骤为后续分析DcTracker的requestNetwork方法奠定了基础。
摘要由CSDN通过智能技术生成
DcTracker对象的初始化,需要从前文中进行分析,我们来看看其的初始化

PhoneFactory.java

public static void makeDefaultPhone(Context context) {
    ......
    for (int i = 0; i < numPhones; i++) {
           Phone phone = null;
           int phoneType = TelephonyManager.getPhoneType(networkModes[i]);
           if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {
               phone = new GsmCdmaPhone(context,
                   sCommandsInterfaces[i], sPhoneNotifier, i,
                       PhoneConstants.PHONE_TYPE_GSM,
                        TelephonyComponentFactory.getInstance());
           } else if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {
               phone = new GsmCdmaPhone(context,
                  sCommandsInterfaces[i], sPhoneNotifier, i,
                            PhoneConstants.PHONE_TYPE_CDMA_LTE,
                            TelephonyComponentFactory.getInstance());
           }
           ......
           sPhones[i] = phone;
     }
     ......
}
新建GsmCdmaPhone对象

public GsmCdmaPhone(Context context, CommandsInterface ci, PhoneNotifier notifier,
                    boolean unitTestMode, int phoneId, int precisePhoneType,
                    TelephonyComponentFactory telephonyComponentFactory) {
    super(precisePhoneType == PhoneConstants.PHONE_TYPE_GSM ? "GSM" : "CDMA",
            notifier, context, ci, unitTestMode, phoneId, telephonyComponentFactory);

    // phone type needs to be set before other initialization as other objects rely on it
    mPrecisePhoneType = precisePhoneType;
    initOnce(ci);
    initRatSpecific(precisePhoneType);
    mSST = mTelephonyComponentFactory.makeServiceStateTracker(this, this.mCi);
    // DcTracker uses SST so needs to be created after it is instantiated
    // Leo, 初始化DcTracker
    mDcTracker = mTelephonyComponentFactory.makeDcTracker(this);
    mSST.registerForNetworkAttached(this, EVENT_REGISTERED_TO_NETWORK, null);
    logd("GsmCdmaPhone: constructor: sub = " + mPhoneId);
}
public DcTracker makeDcTracker(Phone phone) {
	// Leo, 初始化DcTracker,注意起传入的参数为Phone对象,这样就与Phone进行绑定了
    return new DcTracker(phone);
}
注意传入的参数为phone,也就是说,每一个phone会对应一个DcTracker

public DcTracker(Phone phone) {
    super();
    mPhone = phone;

    if (DBG) log("DCT.constructor");

    mResolver = mPhone.getContext().getContentResolver();
    // Leo, 初始化UiccController对象
    mUiccController = UiccController.getInstance();
    // Leo,调用registerForIccChanged方法,注册EVENT_ICC_CHANGED消息
    mUiccController.registerForIccChanged(this, DctConstants.EVENT_ICC_CHANGED, null);
    // Leo, 初始化AlarmManager对象,并且将其构造方法中的第一个参数设置为AlarmManagerService
    mAlarmManager = (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE);
    // Leo,初始化ConnectivityManager,并且将其构造方法中的第二个参数设置为ConnectivityService
    mCm = (ConnectivityManager) mPhone.getContext().getSystemService(
            Context.CONNECTIVITY_SERVICE);


    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
    filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
    filter.addAction(INTENT_DATA_STALL_ALARM);
    filter.addAction(INTENT_PROVISIONING_APN_ALARM);
    filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);

    // TODO - redundent with update call below?
    // Leo,默认打开数据连接,即DataEnabled为true
    mDataEnabledSettings.setUserDataEnabled(getDataEnabled());

    // Leo,注册BroadcastReceiver
    mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone);

    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mPhone.getContext());
    // Leo,默认为false
    mAutoAttachOnCreation.set(sp.getBoolean(Phone.DATA_DISABLED_ON_BOOT_KEY, false));

    // Leo,初始化SubscriptionManager,并且添加注册SubscriptionsChangedListener
    mSubscriptionManager = SubscriptionManager.from(mPhone.getContext());
    mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener);

    HandlerThread dcHandlerThread = new HandlerThread("DcHandlerThread");
    dcHandlerThread.start();
    Handler dcHandler = new Handler(dcHandlerThread.getLooper());
    // Leo,初始化DcController对象
    mDcc = DcController.makeDcc(mPhone, this, dcHandler);
    mDcTesterFailBringUpAll = new DcTesterFailBringUpAll(mPhone, dcHandler);

    mDataConnectionTracker = this;
    registerForAllEvents();
    update();
    mApnObserver = new ApnChangeObserver();
    phone.getContext().getContentResolver().registerContentObserver(
            Telephony.Carriers.CONTENT_URI, true, mApnObserver);

    // Leo, 初始化ApnContext
    initApnContexts();

    for (ApnContext apnContext : mApnContexts.values()) {
        // Register the reconnect and restart actions.
        filter = new IntentFilter();
        filter.addAction(INTENT_RECONNECT_ALARM + '.' + apnContext.getApnType());
        mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone);
    }

    // Add Emergency APN to APN setting list by default to support EPDN in sim absent cases
    initEmergencyApnSetting();
    addEmergencyApnSetting();

    mProvisionActionName = "com.android.internal.telephony.PROVISION" + phone.getPhoneId();

    mSettingsObserver = new SettingsObserver(mPhone.getContext(), this);
    registerSettingsObserver();
}
从这边可以看到,在DcTracker的构造方法中,主要是做了

1. 初始化一些对象,UiccController,AlarmManager对象,ConnectivityManager对象等

2. 注册一些广播

3. mDataEnabledSettings.setUserDataEnabled(getDataEnabled());

4. mAutoAttachOnCreation.set(sp.getBoolean(Phone.DATA_DISABLED_ON_BOOT_KEY, false));

5. 注册一些Event,和更新状态

6. 初始化ApnContext

7. 初始化紧急APN

接下来我们就一步步看下其初始化的流程

一. 初始化一些对象

1. UiccController的初始化

// Leo, 初始化UiccController对象
        mUiccController = UiccController.getInstance();
        // Leo,调用registerForIccChanged方法,注册EVENT_ICC_CHANGED消息
        mUiccController.registerForIccChanged(this, DctConstants.EVENT_ICC_CHANGED, null);

pub
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值