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

Android 14 版本 TelephonyComponentFactory 技术点详解 提高产品竞争力和可靠性,也提升个人能力,没有任何书提到的框架架构技巧的内容,希望帮助到大家 阅读详情
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);
Android 7.0 状态栏显示运营商名称 1 在mobile_signal_group布局中增加 &lt;TextView android:id="@+id/carrier_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/keyguard_carri... 阅读详情

相关推荐

(N)Telephony分析(六)之DcTracker的requestNetwork分析

在PhoneApp的初始化中,我们分析到,TelephonyNetworkFactory的初始化,最终会调用到DcTracker的requestNetwork方法 private void onNeedNetworkFor(Message msg) { NetworkRequest networkRequest = (NetworkRequest)msg.obj; boolean

每个片段都值得深深纪念 2172

(N)Telephony分析(四)之PhoneApp初始化分析

从上一篇中,分析到,调用了PhoneApp的onCreate方法,从此进入了PhoneApp的世界,那么就需要看看其onCreate方法中究竟做了什么 public void onCreate() { if (UserHandle.myUserId() == 0) { // We are running as the primary user, so sh

每个片段都值得深深纪念 2077

(N)Telephony分析(七)之DataConnection建立

在前面,我们分析过DcTracker的初始化的时候,我们有看过,在DcTracker的构造方法中,调用有如下这个方法 private void registerForAllEvents() { mPhone.mCi.registerForAvailable(this, DctConstants.EVENT_RADIO_AVAILABLE, null); mPhone.mCi.re

每个片段都值得深深纪念 3215

RK3568-ANDROID11-4G-EC20-调试篇(移远模块)

首先,要先获得技术支持 步骤一,先在USB模块上完成4G 步骤二,移植到PCIE座子上 磨刀不费砍材功,请先拿到技术文档支持,我的参考是:Quectel_Android_RIL_Driver_V3.3.62_master_beta(支持EC200A).tgz 主要文件:Quectel_Android_RIL_Driver_V3.3.62_master_beta(支持EC200A)\libquectel-ril\arm64-v8a\libreference-ril.so 主要文档:Quectel_A

longmin96的博客 6453

Framework中的连接管理机制(原)

上一节《Wifi服务框架介绍》介绍了WIFI的大致框架,本文主要介绍连接管理中的几个重要角色,包括:NetworkInfo、NetworkAgent、ConnectivityService、ConnectivityManager等。         为了便于讨论,本文选取一个具体问题展开分析,那就是:当当前的网络连接变为不可用时,系统如何自动切换其他可用的网络连接的。         我们知道

阿杜的专栏 1万+

Mac用户解决WPS中的俄语显示红线问题(WPS添加外语拼写检查)

我所使用的WPS版本:AppleStore 下载的 MacOs版 3.3.0 首先,对于 在访达-应用程序中,找到WPS,右键-点击“显示包内容” 然后按照下图的索引目录(Contents\Resource\office6\dicts\spellcheck),最后进入一个叫“spellcheck”的文件夹 最后将下载好的字典包(例如上图中的 en_US就代表美式英语;ru_RU就代表俄语) 关于字典包资源下载,我在网上找到一个Google云盘,里面包含了法语,德语,西语,意大利语,葡萄牙.

qq_48159150的博客 7893

V2签名预装失败原因及解决方案

GOOGLE最新的GTS要求targetSdkVersion 大于30的APK必须使用V2及以上签名。 但实际在预装过程中,GTS测试会失败。 后面发现这是由于预装方式的原因造成的。原来的预装方式是使用APK,指定APK使用预签名的方式。Android.mk如下: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := DKTest LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_TAGS

zyfzhangyafei的专栏 6303

别再手动算了!用Excel函数一键搞定AQI和首要污染物分析(附完整公式模板)

本文介绍如何利用Excel函数自动化计算AQI和首要污染物分析,大幅提升数据处理效率。通过构建标准化输入模板、智能计算IAQI、自动判定AQI与首要污染物,并生成可视化仪表盘,帮助环保工作者快速完成每日监测报告。

weixin_30443075的博客 343

远程桌面(RDP)共享USB设备全攻略:不止Hyper-V,你的加密狗和CH340串口也能远程用

本文详细介绍了远程桌面(RDP)共享USB设备的完整解决方案,包括加密狗和CH340串口设备的远程使用技巧。通过RemoteFX USB重定向技术,用户可以在远程会话中无缝使用本地USB设备,提升工作效率。文章涵盖企业级配置、典型设备实战案例及高级故障排除方法,是远程工作者的实用指南。

weixin_42522964的博客 332

win10+conda+pytorch-gpu安装

pytorch 官网上只有linux和Mac的程序包,没有windows系统的,但是windows系统还是可以用pytorch的。  github: https://github.com/peterjc123/pytorch-scripts 首先要安装anaconda: 推荐清华镜像 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ ...

一摩尔自由的博客 1万+

得利捷datalogic扫码枪调试说明

针对得利捷datalogic扫码枪快速调试并,可以根据详细步骤设置扫码枪,并配有tcp调试助手辅以验证,以达到快速调试完成扫码枪的工作。

Conway510的博客 1万+

14、固态变压器(SST)供电的直流微电网控制策略解析

本文详细解析了基于固态变压器(SST)供电的直流微电网的分层功率管理与控制策略。重点介绍了二次控制和三次控制算法的原理及实现方式,探讨了将SST作为固态同步电机(SSSM)的控制概念及其频率调节方法。通过小型直流微电网的实验案例验证了控制策略的有效性,并对不同三次控制方法的优缺点进行了比较。最后,文章提出了未来控制策略的优化方向,包括通信技术提升、多目标优化和智能算法的应用,为直流微电网的可靠、高效运行提供了理论支持和实践指导。

star的博客 551

eNSP常见故障处理

eNSP无法启动设备一直停在#井号的问题的解决方案?

lvshiliang123的博客 2万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: (N)Telephony分析(四)之PhoneApp初始化分析
下一篇: (N)Telephony分析(六)之DcTracker的requestNetwork分析
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值