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

Posted

技术标签:

【中文标题】确定 Android 设备中的 3G/WIFI 无线电状态机当前状态【英文标题】:determine 3G/WIFI radio state machine current state in Android device 【发布时间】:2014-10-21 09:54:03 【问题描述】:

我的应用程序不断接收位置更新和活动识别更新,并不时将所有收集到的活动和位置记录分批发送到服务器。

我知道每次我执行网络操作时 - WIFI 或移动设备的无线电状态(取决于当前的活动连接)都会进入活动状态,并在待机状态下保持一段时间 - 什么会显着影响执行频繁的网络请求时的电池使用情况,因此我正在安排警报以执行与服务器的同步,以便在 2 小时内执行一次,或者当用户明确使用我的应用程序时。

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

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

我的问题:

是否可以按照我的描述检测到这种无线电状态? 如果是,那怎么办?您认为这样做是个好主意吗?

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

【问题讨论】:

【参考方案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。老实说,我记得我也读过一些关于网络计时器的东西,但现在找不到源了。

编辑: 我找到了缺失的来源:Project Volta 已在 Android 5.0 中引入,为您提供额外的电池功能。

【讨论】:

【参考方案2】:

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

这个想法是像这样使用ConnectivityManager:

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

不过我还没有尝试过。

【讨论】:

以上是关于确定 Android 设备中的 3G/WIFI 无线电状态机当前状态的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 3G / WiFi 连接

快递员扫描的设备是什么?

某些设备按下按钮时获取应用程序中的位置时Android无响应

没有活动的Android Context?和其他无活动编程?

androd H5混合开发 当无网络下,android怎么加载H5界面

Bootstrap Navbar仅对Android设备无响应