在Android上检测网络连接?

问题描述:

操作系统:Android的在Android上检测网络连接?

考虑:用户已表示,他们希望保持连接到应用程序的服务器接收更新等

目标:确保即使在应用程序是在后台用户连接到应用程序的服务器州。

问题:有一个问题偶尔会断开与网络的连接。如果用户失去了数据网络连接(丢失2G,3G,WiFi),然后重新获得连接,我们的应用就没有连接。我目前正在尝试使用PhoneStateListener来检测各种网络更改,并在适当时重新启动与服务器的连接。在我的Nexus One(2.1)上,我发现onSignalStrengthsChangedonDataConnectionStateChanged不会被调用,除非监听器最初被注册,但之后不会。听众是在服务内部注册的,所以只要服务处于活动状态(我们可以认为这是'永远')。有没有其他人在收听数据连接状态时遇到任何问题?

onServiceStateChanged似乎是迄今为止最可靠的,但我想知道人们是否也与其他听众一起成功。

由于*上不允许我去,否则关闭的问题,我会提供答案,为什么我的PhoneStateListeners不工作:

我发现我的问题仅仅是我没有按位注册听众,而是先后注册(即
telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
telephonyManager.listen(listener, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
.
.
.

而不是(正确的):
telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE..............);

我会关闭这个问题,也许稍后会打开一个不同的问题,要求提供有关在Android上维护“始终活着”连接到服务器的设计建议。谢谢。

我想你必须定期发送keepalive消息来检查连接是否仍然存在。如果没有,重新建立它。有一大堆理由说明你的连接可能会下降,你将无法检查所有这些客户端。

虽然可能会考虑使用谷歌的云服务,因为它们已经为此打开了连接。这样,你的用户的手机将不会有保持另一个连接(这可能是相当昂贵的)的开销

据我所知,当应用程序在后台时无法调用监听器。你应该尝试使用服务而不是活动。

而且还记得在适当的方法来检索TelephonyManager

TelephonyManager mTelephonyMgr = (TelephonyManager)getActivity().getSystemService(Context.TELEPHONY_SERVICE); 
+0

我打算说,监听器是在服务内部注册的。感谢您注意这一点。 (问题已编辑)。 – ChaimKut 2011-02-23 11:47:19

我想你会使用ConnectivityManager为此。

回答有关网络连接状态的查询的类。它还会在网络连接发生变化时通知应用程序。通过调用Context.getSystemService(Context.CONNECTIVITY_SERVICE)获取此类的实例。

http://developer.android.com/reference/android/net/ConnectivityManager.html

每文档,它监控网络连接性和变化发送广播意图给应用程序。