2012-11-26 136 views
1

我的應用程序在後臺運行(作爲服務),並且需要始終連接到遠程服務器以接收和發送消息。Android Internet連接廣播接收器

此服務運行管理其與服務器的連接(帶插座)一個線程

我試圖寫一個互聯網連接廣播接收器將運行每次上網狀態改變時,並檢查狀態連接斷開。

我的問題如下:當我連接到Wi-Fi網絡時,廣播接收器意圖被髮射幾次,其中所有的互聯網連接狀態都是真實的(每次火災之間沒有斷開,意味着我有幾個新的線程使用套接字來連接服務器。

我怎樣才能確保我得到的狀態的互聯網權利,並通過我的意思是.isConnected()方法將返回如果和?只有當連接連接

這是我的代碼:

public void onReceive(Context context, Intent intent) 
{  
    action = intent.getAction(); 
    app = (AppVariables) context.getApplicationContext();  
    if (app.isApplicationInitilized()) 
    { 
     if (action.equals(action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION))) 
     { 
      networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 
      if (networkInfo.isConnected()) 
       app.getServerConnectionManager().startServer(); 
     } 
     else if(action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) 
     { 
      networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);     
      if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI && !networkInfo.isConnected()) 
       app.getServerConnectionManager().stopServer(false); 
      else if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE && !networkInfo.isConnected()) 
       app.getServerConnectionManager().stopServer(false); 
      else 
       app.getServerConnectionManager().startServer(); 
     }   
    }  
} 
+0

您正在使用的操作請讓我知道。我也需要使用。預先感謝 – rup35h

回答

0

我有同樣的問題,我的應用程序之一,我們部署模式(成功)如下:

onReceive(): 
    if(networkInfo.isConnected()) 
     fireTimerForSecondaryCheck(); 
    else 
     not connected; 

SecondaryCheck: 
    if(loadKnownUrl()) 
      is connected. 
      fire long timer for secondary check 
    else 
      fire short timer for secondary check 

基本上,這樣做是試圖訪問網絡,一旦網絡管理器報告無線上網。如果它收到預期內容,則網絡連接已啓動並正常工作,我會在兩分鐘後再次檢查。如果我沒有收到預期內容,則表示網絡連接未完全打開,無法連接到互聯網,或者WiFi可能有TOS或類似的着陸頁。在這種情況下,我會在10秒內再次檢查。

FWIW,我的NetworkMonitorService廣播連接到我的應用程序,它註冊它,並根據需要更新UI。

這是在2.3.3中開發的,我相信較新的Android版本(4+)在網絡狀態中具有更精細的粒度,但我還沒有看到需要在生產中調整此代碼。它從2.2個設備一路運行到4.2。

+0

,但是當連接到無線網絡時,您寫的代碼將會像廣播火災一樣多次運行。讓我們說它發射4次 - 4個接收器將午餐。你怎麼知道哪一個接收者應該創建一個到服務器的新連接?順便說一句,你知道是什麼原因造成的嗎?也許這將有助於瞭解發生了什麼 –

+0

我註冊我的如下:'this.registerReceiver(this.myWifiReceiver,新的IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));'和我很確定我只有一個火每個WiFi狀態轉換。 – 323go

+0

剛剛驗證 - 使用我之前的評論中註冊的廣播接收器僅在每個無線網絡轉換時觸發onceceive一次。 (Gtab2/7「,Android 4.0.3,它離我的筆記本電腦最近) – 323go

0

如果我理解正確,您需要知道連接的狀態。 您可以通過使用networkInfo狀態獲得:

State state = networkInfo.getState();

if(state == State.CONNECTED)do_something