我想写一个轮询服务器的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;
}
};
有没有办法确定网络目前是否正在使用?
答案 0 :(得分:1)
更准确地说,任何超过某个小阈值(通常大约128字节)的数据传输都会触发设备切换到所谓的DCH状态(Dedicated CHannel),并在最后一位传输给另一个后保留在那里。 5到10秒,直到进入FACH状态(共享信道 - 更高的延迟,低吞吐量),在另一个0-15秒内将返回IDLE。这里的可变性不是随机的 - 它取决于网络配置和移动设备(例如它是否支持快速休眠1?)这些是可以在不同网络中常见的值。这两个计时器的总和是每次传输后浪费能量的时间。
顺便说一下,这个专用信道状态的无线电使用的功率与CPU的功率相当,即使只是在高能状态下等待。
事实上,从能源角度进行轮询几乎没有效率 - 尝试在任何可能的情况下进行推送,或者通过一些长期存在的连接来保持低周(!)周期,或使用系统 - 本机推送机制 - 他们的系统已经过很好的优化,并且使用该服务在所有应用程序中分摊链接的成本。
现在你应该能够找出一个用ping计算估算的算法,但显然不要用ping来检查你所处的状态,以决定现在是否是发送的好时机。
修改强>
虽然它仍然没有为您提供有关当前网络流量的信息,但您可能还需要查看Android的SyncAdapter - 它可以控制框架以安排同步操作发生的时间。