数据业务建立流程之APN参数的激活

APN参数在前面《 数据业务建立流程之常规APN参数的创建》一文中已经都被创建完毕并存入mAllApnSettings的数组中,但是这些APN参数默认都是没有被Enable的, 只有当APN被Enable之后,该APN才可以被使用,下面我们就来看如何将一个APN参数激活。
        APN的Enable是通过TelephonyNetworkFactory中的needNetworkFor()方法触发的,我们在《 网络连接评分机制之NetworkFactory》文章中介绍过,当当前网络的评分比其他网络高时,就会通过needNetworkFor()方法触发当前网络的建立。比如当前WIFI断开时,如果发现数据网络是打开的,此时就会通过该方法激活数据流量,从而实现从WIFI到数据的转换过程。
        而当needNetworkFor()被触发时,就会引发APN的Enable过程:
  1. protected void needNetworkFor(NetworkRequest networkRequest, int score) {  
  2.     //根据网络需求寻找合适APN  
  3.     ApnContext apnContext = apnContextForNetworkRequest(networkRequest);  
  4.     //Enable上网用的APN  
  5.     if (apnContext != null) apnContext.incRefCount();  
  6. }  
        由于不同网络需求可能需要不同的APN参数,因此先要经过apnContextForNetworkRequest()来寻找合适的APN,对于上网来说,其寻找到的APN类型为TYPE_MOBILE,然后通过incRefCount()来Enable当前的APN:
  1. @ApnContext.java  
  2. public void incRefCount() {  
  3.     synchronized (mRefCountLock) {  
  4.         if (mRefCount++ == 0) {  
  5.             //设置Enable  
  6.             mDcTracker.setEnabled(mDcTracker.apnTypeToId(mApnType), true);  
  7.         }  
  8.     }  
  9. }  
        这里需要用到DcTracker父类DcTrackerBase中的setEnabled()方法来将APN打开:
  1. @DcTrackerBase.java  
  2. protected void setEnabled(int id, boolean enable) {  
  3.     Message msg = obtainMessage(DctConstants.EVENT_ENABLE_NEW_APN);  
  4.     msg.arg1 = id;  
  5.     msg.arg2 = (enable ? DctConstants.ENABLED : DctConstants.DISABLED);  
  6.     sendMessage(msg);  
  7. }  
        这里发送了一条EVENT_ENABLE_NEW_APN的消息,该消息将会在DcTrackerBase中handleMessage()中被处理:
  1. @DcTrackerBase.java  
  2. public void handleMessage(Message msg) {  
  3.     switch (msg.what) {  
  4.         case DctConstants.EVENT_ENABLE_NEW_APN:  
  5.             onEnableApn(msg.arg1, msg.arg2);  
  6.             break;  
  7.     }  
  8. }  
        这里的onEnableApn()在子类DcTracker中被覆盖:
  1. @DcTracker.java  
  2. protected void onEnableApn(int apnId, int enabled) {  
  3.     ApnContext apnContext = mApnContexts.get(apnIdToType(apnId));  
  4.     if (apnContext == null) {  
  5.         loge("onEnableApn(" + apnId + ", " + enabled + "): NO ApnContext");  
  6.         return;  
  7.     }  
  8.     //打开APN  
  9.     applyNewState(apnContext, enabled == DctConstants.ENABLED, apnContext.getDependencyMet());  
  10. }  
        继续看applyNewState()过程,这里传递的第二个参数为true,第二个参数是从networkAttributes数组中读取的,默认都为true。
  1. private void applyNewState(ApnContext apnContext, boolean enabled, boolean met) {  
  2.     boolean cleanup = false;  
  3.     boolean trySetup = false;  
  4.     if (apnContext.isReady()) {  
  5.         //APN如果已经被Enable  
  6.     } else {  
  7.         if (enabled && met) {  
  8.             //APN需要被Enable  
  9.             if (apnContext.isEnabled()) {  
  10.                 apnContext.setReason(Phone.REASON_DATA_DEPENDENCY_MET);  
  11.             } else {  
  12.                 //设置reason为REASON_DATA_ENABLED  
  13.                 apnContext.setReason(Phone.REASON_DATA_ENABLED);  
  14.             }  
  15.             if (apnContext.getState() == DctConstants.State.FAILED) {  
  16.                 apnContext.setState(DctConstants.State.IDLE);  
  17.             }  
  18.             trySetup = true;  
  19.         }  
  20.     }  
  21.     //Enable当前APN  
  22.     apnContext.setEnabled(enabled);  
  23.     //设置其mDependencyMet属性也为true  
  24.     apnContext.setDependencyMet(met);  
  25.     //清除当前连接  
  26.     if (cleanup) cleanUpConnection(true, apnContext);  
  27.     //建立数据连接  
  28.     if (trySetup) trySetupData(apnContext);  
  29. }  
        由于enabled、met两个参数此时都为true,因此将会设置APN的Reason为REASON_DATA_ENABLED,并且其mDataEnabled和mDependencyMet属性都为true:
  1. public void setEnabled(boolean enabled) {  
  2.     mDataEnabled.set(enabled);  
  3. }  
  4. public void setDependencyMet(boolean met) {  
  5.     mDependencyMet.set(met);  
  6. }  
        再来看一下该APN参数isReady的判断:
  1. public boolean isReady() {  
  2.     return mDataEnabled.get() && mDependencyMet.get();  
  3. }  
        由此可知,以后当判断该APN是否isReady()时,将会得到true的状态,也就是说,当前APN已经准备就绪。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值