2011-02-23 104 views
0

操作系統:Android的在Android上檢測網絡連接?

考慮:用戶已表示,他們希望保持連接到應用程序的服務器接收更新等

目標:確保即使在應用程序是在後臺用戶連接到應用程序的服務器州。

問題:有一個問題偶爾會斷開與網絡的連接。如果用戶失去了數據網絡連接(丟失2G,3G,WiFi),然後重新獲得連接,我們的應用就沒有連接。我目前正在嘗試使用PhoneStateListener來檢測各種網絡更改,並在適當時重新啓動與服務器的連接。在我的Nexus One(2.1)上,我發現onSignalStrengthsChangedonDataConnectionStateChanged不會被調用,除非監聽器最初被註冊,但之後不會。聽衆是在服務內部註冊的,所以只要服務處於活動狀態(我們可以認爲這是'永遠')。有沒有其他人在收聽數據連接狀態時遇到任何問題?

onServiceStateChanged似乎是迄今爲止最可靠的,但我想知道人們是否也與其他聽衆一起成功。

回答

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

我想你必須定期發送keepalive消息來檢查連接是否仍然存在。如果沒有,重新建立它。有一大堆理由說明你的連接可能會下降,你將無法檢查所有這些客戶端。

雖然可能會考慮使用谷歌的雲服務,因爲它們已經爲此打開了連接。這樣,你的用戶的手機將不會有保持另一個連接(這可能是相當昂貴的)的開銷

0

據我所知,當應用程序在後臺時無法調用監聽器。你應該嘗試使用服務而不是活動。

而且還記得在適當的方法來檢索TelephonyManager

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

我打算說,監聽器是在服務內部註冊的。感謝您注意這一點。 (問題已編輯)。 – ChaimKut 2011-02-23 11:47:19

0

我想你會使用ConnectivityManager爲此。

回答有關網絡連接狀態的查詢的類。它還會在網絡連接發生變化時通知應用程序。通過調用Context.getSystemService(Context.CONNECTIVITY_SERVICE)獲取此類的實例。

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

每文檔,它監控網絡連接性和變化發送廣播意圖給應用程序。