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";


  • 相关阅读:
    linux之awk命令
    HDU 2097 Sky数 进制转换
    HDU 2077 汉诺塔IV
    HDU 2094 产生冠军 dfs加map容器
    HDU 2073 叠框
    HDU 2083 简易版之最短距离
    HDU 2063 过山车 二分匹配
    天梯 1014 装箱问题
    天梯 1214 线段覆盖
    天梯 1098 均分纸牌
  • 原文地址:https://www.cnblogs.com/jimwind/p/3175153.html
Copyright © 2011-2022 走看看