设定应用中流量使用情况选项里默认警告字节数的初始化问题

http://blog.sina.com.cn/s/blog_4c0706560102x0ek.html

 

大家在使用安卓系统的过程中,如果开启移动数据,则在设定应用的流量使用情况选项中可以设定流量警告字节数和流量限制字节数。这样的话,当我们使用移动网络的时候,如果使用过数据流量超过流量警告字节数,则在通知栏会提示用户达到警戒流量,如果使用过的数据流量超过流量限制字节数,则会关闭移动网络业务,并弹出警示框。这一功能可以友好的协助用户管控使用移动网络所产生费用。

 

设定应用中流量使用情况选项里默认警告字节数的初始化问题

设定应用中流量使用情况选项里默认警告字节数的初始化问题

设定应用中流量使用情况选项里默认警告字节数的初始化问题
 

 

       那么这里的流量限制字节和流量警告字节是如何初始化的呢?待笔者慢慢介绍。

 

 

1.  DataUsageSummary.java

     onResume() -> updateBody() -> getLoaderManager().restartLoader(LOADER_CHART_DATA, ChartDataLoader.buildArgs(mTemplate, mCurrentApp), mChartDataCallbacks) -> updatePolicy(true) -> NetworkPolicy policy = mPolicyEditor.getPolicy(mTemplate); ......  mChart.bindNetworkPolicy(policy)

 

    在此通过传入的policy对象,将该对象的limitBytes和warningBytes属性作为初始值来初始化流量限制字节和流量警告字节数。接着我们来查找这个policy对象是如何从NetworkPolicyEditor类的对象mPolicyEditor获得的。

 

2. NetworkPolicyEditor.java

       方法getPolicy是通过传入的当前默认sim卡的NetworkTemplate作为参数,在自己的容器类mPolicies中进行

逐一匹配,返回匹配到的成员policy。接着我们再来查找mPolicies是如何获得值的。

 

3. DataUsageSummary.java

       onCreate() -> mPolicyEditor = new NetworkPolicyEditor(mPolicyManager) ; mPolicyEditor.read() ;

       从这里我们可以看出,NetworkPolicyEditor的容器类mPolicies是通过NetworkPolicyManager的方法getNetworkPolicies()获得并进行处理得到的。所以我们只要找到NetworkPolicyManagerService中的容器mNetworkPolicy是如何初始化的,也就找到了最终答案。

 

4. NetworkPolicyManagerService.java

       经过调试笔者确定mNetworkPolicy是在CONNECTIVITY_ACTION_IMMEDIATE广播接收器中实现初始化的。具体的动作都在ensureActiveMobilePolicyLocked()方法中完成的。当设备第一次运行时mNetworkPolicy没有值所以mobileDefined为false,此时将进行初始化,即将com.android.internal.R.integer.config_networkPolicyDefaultWarning 的值作为流量警告字节,将LIMIT_DISABLED(-1)作为流量限制字节,创建一个NetworkPolicy对象,并将其插入mNetworkPolicy从而完成初始化。

 

       以上大概介绍了一下SIM卡的流量限制字节和流量警告字节的初始值是如何初始化的。下面对整个流程总结一下

首先设备启动后会启动NetworkPolicyManagerService服务,并且调用该服务的systemReady()方法,在其中调用readPolicyLocked(),如果存在/data/system/netpolicy.xml,这个方法会读取这个文件来初始化mNetworkPolicy, 否则mNetworkPolicy为空;后面如果有有效sim卡插入,则执行上面的步骤4来进一步初始化;然后当进入设定的流量使用情况界面时,在onCreate中创建NetworkPolicyEditor对象mPolicyEditor后调用其read()方法来初始化该对象的容器类mPolicies(依赖NetworkPolicyManagerService服务的mNetworkPolicy容器类),当画面load完后在启动另一个线程进一步初始化(开始从上面的步骤1执行)

 

       以上,大概就是限制流量字节数和警告流量字节数的初始化流程。最后强调三点:

 

1. com.android.internal.R.integer.config_networkPolicyDefaultWarning中设置的是默认警告流量字节数(MB);

 

2. 无论用户如何修改,最终的policy信息(包括修改后的限制流量字节数和警告流量字节数)都将保存在/data/system/netpolicy.xml文件中;

 

3. 系统仅对默认的SIM卡来初始化,例如设备插入两张卡,并且第一次启动,则卡1的警告流量字节被初始化为com.android.internal.R.integer.config_networkPolicyDefaultWarning的值2G,卡2将被初始化为-1(disabled)

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值