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