Android 6.0 与 Android 7.0 Data Call Retry对比

0 预备知识

  • data call(简写 DC)指数据业务, 手机需要上网必须开启的业务
  • APN 的作用:手机上网必须要配置的一个参数,决定手机通过哪种接入方式来访问网络,APN 的类型: default(默认是 GPRS 上网)、 mms、 dun、 ims 等

1. DC重试的差异

     Android 从 6.0 升级到 7.0 后,删除了 DataConnetion 中 mRetryingState 状态,此状态能够维护 DC 重试; 7.0 删除该状态后,现在的方案是建立 DC 失败后,在 onDataSetupCompleteError()中进行重试连接。

2 Android 6.0 DC Retry 机制

    Android 6.0 通过状态机来维护 DC 的几种状态,其中包含 DcRetryingState状态,在这种状态下,它能够实现 DC 建立失败后重试, 接下来看下 DC retry 在Android 6.0 上的流程,见图 2-1。单 pdn 时,会出现去断开所有链接的情况,当其他连接全部断开后,会重新去建立 DC。

3 Android 7.0 DC Retry 流程

     在 Android7.0 中, DC retry 流程与 Android6.0 相比,有了一点改变,不在由专门的 Retry 状态机来维护,见图 3-1。

4 Retry时间间隔的设置

4.1 定义的 Retry 的时间间隔

         一般情况下,直接从 CarrierConfigManager.java 中可以进行配置, 见以下代码 :

static {
  ......
  Defaults.putString(KEY_CARRIER_DATA_CALL_RETRY_CONFIG_DEFAULT_STRING,
           "default_randomization=2000,5000,10000,20000,40000,80000:5000,160000:5000,"+
           "320000:5000,640000:5000,1280000:5000,1800000:5000");
  ......
}

       另一种方法, 如果在 APP 进行了配置, 那么,会优先使用在 APP 配置的retry 时间间隔, APP PATH: packages/apps/CarrierConfig/assets/carrier_config_*****.xml。

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<carrier_config_list>
<carrier_config>
<int name="maxMessageTextSize" value="-1" />
......
<string name="carrier_data_call_retry_config_default_string">
default_randomization=2000,5000,10000,20000,40000,80000:5000,160000:5000,320000:5000,640000:5000,1280000:5000,1800000:5000,3600000:5000
</string>
</carrier_config>
</carrier_config_list>

4.2 从字符串中解析出时间间隔

     关于如何解析字符串,可以参照 RetryManager.java 中的 configure(StringconfigStr)方法,这里主要介绍的一点是 RetryForever 的设定,从上面定义的字符串中可以看出"max_retries=infinite",如果解析出这两个字符串存在的话, mRetryForever = true; 也就是永久 retry。

private void configureRetry(boolean forDefault) {
  String configString = "";
  ......
  CarrierConfigManager configManager = (CarrierConfigManager)
  mPhone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE);
  PersistableBundle b = configManager.getConfigForSubId(mPhone.getSubId());
  ......
  if (forDefault) {
      configString = b.getString(
                         CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_DEFAULT_STRING,
                         DEFAULT_DATA_RETRY_CONFIG);
  }
  ......
  configure(configString);
}

华丽分割线

-------------------------------------------------------------------------------------------------------------

以上差异导致了Android N上出现了一个bug,见我的另一篇文章:Bug Fixed--Android N Data Call Retry 时间间隔不能有效增加

猜你喜欢

转载自blog.csdn.net/zhgeliang/article/details/81034837
今日推荐