0

操作系统:安卓

给定:用户表示他们希望保持连接到应用程序的服务器以接收更新等。

目标:即使应用处于后台状态,也能确保用户连接到应用的服务器。

问题:一个问题是偶尔会断开与网络的连接。如果用户失去数据网络连接(失去 2G、3G、WiFi)然后又重新连接,我们的应用程序将没有连接。我目前正在尝试使用PhoneStateListener's 来检测各种网络变化,从而在适当的时候重新启动与服务器的连接。在我的 Nexus One (2.1) 上,我发现它onSignalStrengthsChangedonDataConnectionStateChanged没有被调用,除非听众最初注册,但之后没有。侦听器在 Service 中注册,因此只要 Service 处于活动状态,它们就会持续侦听(出于此问题的目的,我们可以假设它是“永远”的)。有没有其他人在收听数据连接的状态方面有任何问题?

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

4

4 回答 4

2

我猜你必须定期发送keepalive消息来检查连接是否仍然存在。如果没有,请重新建立它。您的连接可能断开的原因有很多,您将无法检查所有这些客户端。

可能会考虑使用谷歌的云服务来做你正在做的事情,因为他们已经为此保持连接打开。这样,您用户的手机就不会再有保持另一个连接的开销(这可能非常昂贵)

于 2011-02-23T10:47:50.597 回答
2

由于 StackOverflow 不允许我以其他方式关闭问题,我将提供为什么我的 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 上保持与服务器的“始终处于活动状态”的连接的设计建议。谢谢。

于 2011-02-23T13:12:55.940 回答
0

我认为您会为此使用 ConnectivityManager。

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

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

根据文档,它监控网络连接并向应用程序发送有关更改的广播意图。

于 2011-04-22T02:15:57.990 回答
0

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

并且还记得以适当的方式检索 TelephonyManager

TelephonyManager mTelephonyMgr = (TelephonyManager)getActivity().getSystemService(Context.TELEPHONY_SERVICE); 
于 2011-02-23T10:57:21.927 回答