当前网络流量的android事件?

时间:2013-07-22 07:58:08

标签: android network-programming broadcastreceiver battery

我想写一个轮询服务器的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;
    }
};

有没有办法确定网络目前是否正在使用?

1 个答案:

答案 0 :(得分:1)

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

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

顺便说一下,这个专用信道状态的无线电使用的功率与CPU的功率相当,即使只是在高能状态下等待。

  • “有没有办法在Android中找到合适的时机来进行投票?” - 不在现有系统中,没有。您可以尝试创建一些聪明的启发式方法,但由于系统不会报告此类信息,因此没有真正好的方法。

事实上,从能源角度进行轮询几乎没有效率 - 尝试在任何可能的情况下进行推送,或者通过一些长期存在的连接来保持低周(!)周期,或使用系统 - 本机推送机制 - 他们的系统已经过很好的优化,并且使用该服务在所有应用程序中分摊链接的成本。

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

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

修改

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