【发布时间】:2012-02-12 16:01:33
【问题描述】:
我有一个在启动完成时运行的服务。此服务需要互联网连接。等待设备连接到互联网的最佳做法是什么? wifi的手机真的不重要。
我当前的解决方案涉及一个 while 循环,它只检查 ConnectivityManager,直到其中一个网络可用,但这感觉很粗俗。
有没有更好的方法来做到这一点?
【问题讨论】:
标签: android service boot connectivity
我有一个在启动完成时运行的服务。此服务需要互联网连接。等待设备连接到互联网的最佳做法是什么? wifi的手机真的不重要。
我当前的解决方案涉及一个 while 循环,它只检查 ConnectivityManager,直到其中一个网络可用,但这感觉很粗俗。
有没有更好的方法来做到这一点?
【问题讨论】:
标签: android service boot connectivity
但这感觉很粗俗
确实:D
骨架代码:https://stackoverflow.com/a/19968708/281545 - 你的情况更简单,因为你不必唤醒 wifi,保持 wifi 锁等。否则(包括这种情况需要很长时间和无线电/CPU 睡眠 - 在这种情况下,一个简单的意图服务不会)在 2 到 3 之间,您需要:
2a。服务获取 wifi 锁
2b。服务调用reconnect()、reassociate() 以及所需的任何内容(这可能是特定于设备的)
【讨论】:
您可以使用广播接收器:
private class ConnectionMonitor extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION))
return;
boolean noConnectivity = intent.getBooleanExtra(
ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
NetworkInfo aNetworkInfo = (NetworkInfo) intent
.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if (!noConnectivity) {
if ((aNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
|| (aNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI)) {
// start your service stuff here
}
} else {
if ((aNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
|| (aNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI)) {
// stop your service stuff here
}
}
}
}
然后,您在代码中的某处实例化:
ConnectionMonitor connectionMonitor = new ConnectionMonitor();
registerReceiver(connectionMonitor, intentFilter);
【讨论】:
android.intent.action.BOOT_COMPLETED 的BroadcastReceiver 中。
BOOT_COMPLETED 接收器启动服务。如果您确定还没有 Internet 连接,则此答案中的代码将进入该服务。您还需要某种超时机制,以防用户根本无法访问 Internet,或者您在 Android 4.0+ 上超出了带宽配额。