确定Android设备中的3G / WIFI无线状态机当前状态

时间:2014-10-21 09:54:04

标签: android android-wifi android-networking network-traffic

我的应用程序不断收到位置更新和活动识别更新,并在一段时间内将所有收集的活动和位置记录一次性发送到服务器。

我知道每次执行网络操作时 - WIFI或移动设备的无线状态(取决于当前的活动连接)是否处于活动状态,并在待机状态下保持一段时间 - 这会对执行频繁的网络请求时的电池使用情况,因此我调度警报以执行与服务器的同步,仅在2小时内执行一次,或者当用户明确使用我的应用程序时。

另一方面,如果可能的话,我们希望以更短的间隔将收集的数据与服务器同步。

我在想,如果我能够知道无线电状态何时因任何原因而变得活跃(例如,当另一个应用程序执行网络操作时) - 这将是一个很好的机会来执行我的同步,以利用无线电是的事实无论如何打开或待机并消耗更多电力。

我的问题:

  • 是否有可能像我所说的那样检测到这种无线电状态?
  • 如果是,那怎么样?你觉得这样做有什么好主意吗?

我期待android 5.0中引入的新JobScheduler将支持网络无线电活动时的调度作业,但根据API情况似乎并非如此。我相信它会同时批量处理所有需要网络的工作,但只有在理想的世界里,当设备上的所有应用程序都能明智地使用它时才会好。

2 个答案:

答案 0 :(得分:1)

简短的回答是否定的,您目前无法确定网络适配器的当前状态。

Android不允许您深入系统。但是,在观察这四个文件中的值时,您可以自己估计状态:

/sys/devices/virtual/net/<InterfaceName>/statistics/tx_packets
/sys/devices/virtual/net/<InterfaceName>/statistics/rx_packets
/sys/devices/virtual/net/<InterfaceName>/statistics/tx_bytes
/sys/devices/virtual/net/<InterfaceName>/statistics/rx_bytes

您可以读取这些文件的当前流量并将其映射到所用网络适配器的相应状态模型。然而,该模型在Wifi,UMTS,LTE等等方面变化很大。In this whitepaper of the PowerTutor developers (page 4),您可以看到Wifi和3G的状态机具有转换条件和时序(它们已经凭经验找到)。

在大多数情况下,最好坚持使用Android开发者页面提供的network usage tips。说实话,我记得也读过一些关于网络计时器的东西,但是找不到源了。

修改 我找到了缺失的来源:Android {5.0}已经推出,为您提供额外的电池功能。

答案 1 :(得分:1)

我对同样的事感到好奇,我终于找到了答案: http://android.xsoftlab.net/training/efficient-downloads/connectivity_patterns.html

我的想法是使用ConnectivityManager这样:

connectivityManager.addDefaultNetworkActiveListener(new OnNetworkActiveListener() {
            @Override
            public void onNetworkActive() {
                // PREFETCH HERE
            }
});

我还没试过。