操作系统:Android
鉴于:用户已声明他们希望保持与应用服务器的连接以接收更新等。
目标:即使应用处于后台状态,也要确保用户已连接到应用的服务器。
问题:一个问题是偶尔会断开与网络的连接。如果用户丢失数据网络连接(丢失2G,3G,WiFi),然后重新获得连接,我们的应用程序将无法连接。我目前正在尝试使用PhoneStateListener
来检测各种网络更改,从而在适当时重新启动与服务器的连接。在我的Nexus One(2.1)上,我发现onSignalStrengthsChanged
和onDataConnectionStateChanged
不会被调用,除非最初注册了侦听器,但之后没有注册。听众在服务中注册,因此只要服务处于活动状态,他们就会持续监听(为了解决这个问题,我们可以假设这是“永远”)。有没有其他人听过数据连接的状态有什么问题?
onServiceStateChanged
似乎是最可靠的,但我想知道人们是否也与其他听众一起取得了成功。
答案 0 :(得分:2)
我猜你必须定期发送keepalive消息来检查连接是否仍然存在。如果没有,请重新建立。您的连接可能会丢失,并且您将无法检查所有这些客户端。
可能会考虑使用谷歌的云服务来处理您正在做的事情,因为他们已经为此保持连接。这样你的用户的手机就不会有保持另一个连接的开销(这可能非常昂贵)
答案 1 :(得分: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上服务器“永远存在”连接的设计建议。感谢。
答案 2 :(得分:0)
据我所知,当应用程序处于后台时,无法调用侦听器。您应该尝试使用服务而非活动。
还记得以适当的方式检索TelephonyManager
TelephonyManager mTelephonyMgr = (TelephonyManager)getActivity().getSystemService(Context.TELEPHONY_SERVICE);
答案 3 :(得分:0)
我认为你会使用ConnectivityManager。
回答有关网络连接状态的查询的类。它还会在网络连接发生变化时通知应用程序。通过调用Context.getSystemService(Context.CONNECTIVITY_SERVICE)获取此类的实例。
http://developer.android.com/reference/android/net/ConnectivityManager.html
根据文档,它监控网络连接并将更改后的广播意图发送给应用程序。