1

我想编写一个轮询服务器的 android 应用程序。我假设启动网络传输(当当前没有网络流量时)需要额外的电池。因此,当已经有网络流量时进行轮询可能会更节能。

我的问题:

  • 我的假设“节省电池等到已经有网络流量”是否正确?
  • 有没有办法在 android 中找出进行投票的正确时机?

到目前为止我所知道的:

我可以注册一个 CONNECTIVITY_CHANGE-broadcastreceiver,通知我网络状态更改(启用/禁用 wlan/gprs)

        IntentFilter filterc = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"); 
        registerReceiver(ConnectivityCheckReceiver, filterc);

这是广播接收器

public final BroadcastReceiver ConnectivityCheckReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        String type;

        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo TestCo = connectivityManager.getActiveNetworkInfo();
        if(TestCo == null)
            isLanConnectedNewValue = false;
        else
            isLanConnectedNewValue = true;

        NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
        if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI)
            type = "Wifi";
        else if(networkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
            type = "umts/3g";
        else
            type = "other";

        if(isLanConnectedNewValue & !isLanConnected){
            // good candidate to do polling
        }
        isLanConnected = isLanConnectedNewValue;
    }
};

有没有办法找出网络当前是否正在使用?

4

1 回答 1

1
  • “节省电池以等到已经有网络流量” - 在蜂窝网络上是正确的,尤其是 3G - 这些网络上的设备能量状态(以及因此消耗的能量)取决于您的网络流量和网络配置的不活动超时以及您发送的越多一个批次,你花在空转上的时间越少,消耗的能量就越多。

更准确地说,任何超过某个小阈值(通常约为 128 字节)的数据传输都会触发设备切换到所谓的 DCH 状态(专用通道),并在最后一位传输完另一个 5-10 后停留在那里进入 FACH 状态(共享通道 - 更高延迟,低吞吐量)的秒数,再过 0 - 15 秒将返回 IDLE。这里的可变性不是随机的——它取决于网络配置和移动设备(例如它是否支持快速休眠1?),这些是在不同网络中常见的值。这两个计时器的总和是您在每次传输后浪费能量的时间量。

顺便说一句,处于这种专用信道状态的无线电使用的功率与 CPU 的功率相当,即使只是在高能量状态下等待也是如此。

  • “有没有办法在 android 中找出进行投票的正确时机?” - 不在当前系统中,不。您可以尝试创建一些巧妙的启发式方法,但没有真正好的方法,因为系统不会报告此类信息。

事实上,从能量的角度进行轮询几乎没有效率 - 尝试尽可能地进行推送,或者通过一些以低(!)周期保持活动的长期连接,或者使用系统原生推送机制- 他们的系统得到了很好的优化,链接成本在使用该服务的所有应用程序中分摊。

  • 额外的一点:没有用于找出特定网络中的计时器的 API。但是,如果您真的想要这样,在您当前的网络场景中估计它们的一种非常简单的方法是使用 ping:如果您以足够高的频率(例如 0.2 秒)进行 ping,您应该看到三个非常不同的延迟数据包:略高于 2000 毫秒,然后是几百毫秒,最后是 60-80 毫秒。超过 2000 毫秒意味着您处于空闲状态 - 这是完成所有信令以建立 3G 链路所需的时间。数百毫秒意味着您处于共享状态 (FACH),最低频段意味着您已经处于专用的高带宽状态 (DCH)。

现在你应该能够找出一种算法来计算使用 ping 的估计值,但显然不要使用 ping 来检查你所处的状态来决定现在是否是发送的好时机。

编辑:

尽管它仍然没有为您提供有关当前网络流量的信息,但您可能还想看看 Android 的 SyncAdapter - 它可以控制框架以安排何时发生同步操作。

于 2013-07-30T22:24:14.797 回答