zoukankan      html  css  js  c++  java
  • mTracker ----- MPDP

    PhoneBase.java
    public void notifyDataConnection(String reason){
    boolean supportMpdp = SystemProperties.getBoolean("persist.telephony.mpdp",true);
    if(supportMpdp)
    mNotifier.notifyDataConnectionMpdp(Phone.APN_TYPE_DEFAULT, this, reason);
    else
    mNotifier.notifyDataConnection(this, reason);
    }

    调用PhoneBase.java 的 notifyDataConnection 有
    trySetupData 在
    1.CdmaDataConnectionTracker
    2.GsmDataConnectionTracker
    3.MpdpMsmsGsmDataConnectionTracker
    4.MsmsGsmDataConnectionTracker

    setupData 在
    1.CdmaDataConnectionTracker
    2.GsmDataConnectionTracker

    先关注MpdpMsmsGsmDataConnectionTracker.java的trySetupData
    (MsmsGsmDataConnectionTracker.java)onEnableNewApn -> (MsmsGsmDataConnectionTrackerProxy.java)onEnableNewApn -> onEnableNewApnInternal -> trySetupData(Phone.REASON_APN_SWITCHED);

    关注MsmsGsmDataConnectionTracker.java的onEnableNewApn
    MpdpMsmsGsmDataConnectionTracker.java onEnableApn -> onEnableNewApn
    DataConnectionTracker handleMessage & onEnableApn -> onEnableNewApn

    关注MpdpMsmsGsmDataConnectionTracker.java 的 onEnableApn
    DataConnectionTracker.java handleMessage EVENT_ENABLE_NEW_APN
    关键此Tracker对象是哪个子类的对象。应该存在一个mTracker数组中。

    继续跟踪:EVENT_ENABLE_NEW_APN
    setEnabled 发送了这个消息,调用这个函数的enableApnType定义在DataConnectionTracker.java和MpdpMsmsGsmDataConnectionTracker.java

    在CdmaDataConnectionTracker和GsmDataConnectionTracker中定义了onReceive;在PhoneBase.java中也定义了enableApnType
    分别有intent为android.intent.action.CONNECT_CDMA和android.intent.action.CONNECT_GSM

    关注PhoneBase.java中的enableApnType
    有PoneProxy和PhoneInterfaceManager调用。

    MobileDataStateTracker.java reconnect -> setEnableApn -> mPhoneService.enableApnType

    关注reconnect
    ConnectivityService.java
    handleSetMobileData -> mNetTrackers[ConnectivityManager.TYPE_MOBILE].reconnect();
    setMobileDataEnabledByPhoneId -> mNetTrackers[ConnectivityManager.TYPE_MOBILE].reconnect();
    startUsingNetworkFeature -> network.reconnect()
    tryFailover -> checkTracker.reconnect()

    ConnectivityManager.java
    setMobileDataEnabledByPhoneId -> mService.setMobileDataEnabledByPhoneId

    ...

    现在关注多PDP的流程:
    由上流程知,关键在创建的时候对象是不是MpdpMsmsGsmDataConnectionTracker
    找到创建的地方:frameworks/base/telephony/java/com/android/internal/telephony/gsm/MsmsGsmDataConnectionTrackerProxy.java
    public static GsmDataConnectionTracker getTrackerInstance(GSMPhone phone){
    int phoneId = phone.getPhoneId();
    boolean supportMpdp = SystemProperties.getBoolean("persist.telephony.mpdp",true);
    if(supportMpdp){
    sTracker = new MpdpMsmsGsmDataConnectionTracker[PhoneFactory.getSimCount()];
    sTracker[phoneId] = new MpdpMsmsGsmDataConnectionTracker(phone);
    } else {
    sTracker = new MsmsGsmDataConnectionTracker[PhoneFactory.getPhoneCount()];
    sTracker[phoneId] = MsmsGsmDataConnectionTracker(phone);
    }
    return sTracker[phoneId];
    }
    在MpdpMsmsGsmDataConnectionTracker.java 的 getTrackerInstance函数中,可以看到sTracker是一个只有一个元素的数组,因为G+C项目的getSimCount()的值为1.

    =====================================================================================================================================
    ConnectivityService.java private ConnectivityService(Context context){
    mNetTrackers = new NetworkStateTracker[ConnectivityManager.MAX_NETWORK_TYPE + 1]; [15]
    }
      
    public static final int TYPE_MOBILE = 0;
    public static final int TYPE_WIFI = 1;
    public static final int TYPE_MOBILE_MMS = 2;
    public static final int TYPE_MOBILE_SUPL = 3;
    public static final int TYPE_MOBILE_DUN = 4;
    public static final int TYPE_MOBILE_HIPRI = 5;
    public static final int TYPE_WIMAX = 6;
    public static final int TYPE_BLUETOOTH = 7;
    public static final int TYPE_DUMMY = 8;
    public static final int TYPE_ETHERNET = 9;
    public static final int TYPE_MOBILE_DM = 10;
    public static final int MAX_RADIO_TYPE = TYPE_MOBILE_DM; 10
    public static final int TYPE_MOBILE_MMS_EXTERNAL = TYPE_MOBILE_DM + PhoneFactory.getPhoneCount(); //mms0 and mms1 12
    public static final int MAX_NETWORK_TYPE = TYPE_MOBILE_MMS_EXTERNAL + PhoneFactory.getPhoneCount();//dm0 and dm1 14
        public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;

    1.GSM DATA + GSM MMS: cmnet + cmwap
    2.GSM DATA + CDMA MMS: cmnet + ctwap
    路由表:http://www.cnblogs.com/jimwind/archive/2013/06/07/3123251.html


    mApnType
       
    static final String APN_TYPE_ALL = "*";
    static final String APN_TYPE_DEFAULT = "default";
    static final String APN_TYPE_MMS = "mms";
    static final String APN_TYPE_SUPL = "supl";
    static final String APN_TYPE_DUN = "dun";
    static final String APN_TYPE_HIPRI = "hipri";
    static final String APN_TYPE_DM = "dm";


  • 相关阅读:
    用js完成毫秒格式数据的日期格式化任务
    廖雪峰js教程笔记3
    事务在 更新和 插入中的用法(转自他人)
    左连接 用于 列转行的一个想法
    MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比
    python中的内方法
    波非那切数列
    python修改最大递归数
    odoo开发微信小程序需要的三个包:xmltodict、pycrypto、itsdangerous
    解决json dumps不能序列化datatime数据类型的问题,通过重写JSONEncoder
  • 原文地址:https://www.cnblogs.com/jimwind/p/3175153.html
Copyright © 2011-2022 走看看