2016-02-03 25 views
1

問題:接收NETWORK_STATE_CHANGED_ACTION爲連接而改變的網絡

我開發Android應用程序需要不同的Wi-Fi網絡之間切換。當用戶決定連接到另一個網絡時,我的應用程序必須等待連接完成,所以我需要知道這是什麼時候發生的。

爲了實現我註冊了一個只接收NETWORK_STATE_CHANGED_ACTION的BroadcastReceiver。當收到廣播時,我得到NetworkInfo額外的並檢查它是否連接。

我在一個Android 5.0設備上測試了它,它工作。但是,當我使用Android 5.1在另一臺設備上測試時,應用程序不會等到連接完成。發生這種情況是因爲在切換到另一個網絡後立即收到廣播,並且NetworkInfo對象指示網絡已連接。

爲什麼會出現這種情況?

最低工作例如:

public class MainActivity extends AppCompatActivity { 

    private BroadcastReceiver receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 
      Log.i("Wi-Fi network state", info.getDetailedState().toString()); 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     IntentFilter intentFilter = new IntentFilter(); 
     intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 
     registerReceiver(receiver, intentFilter); 
    } 

    @Override 
    protected void onDestroy() { 
     unregisterReceiver(receiver); 
     super.onDestroy(); 
    } 
} 

在運行此程序,我手動切換到另一網絡。以下是日誌中打印的NETWORK_STATE_CHANGED_ACTION事件:

02-03 17:25:23.786 I/Wi-Fi network state: CONNECTED  <-- Why? I'm disconnecting :(
02-03 17:25:23.794 I/Wi-Fi network state: DISCONNECTED 
02-03 17:25:23.800 I/Wi-Fi network state: DISCONNECTED 
02-03 17:25:23.898 I/Wi-Fi network state: DISCONNECTED 
02-03 17:25:23.941 I/Wi-Fi network state: DISCONNECTED 
02-03 17:25:23.944 I/Wi-Fi network state: CONNECTING 
02-03 17:25:23.955 I/Wi-Fi network state: CONNECTING 
02-03 17:25:26.205 I/Wi-Fi network state: AUTHENTICATING 
02-03 17:25:26.210 I/Wi-Fi network state: OBTAINING_IPADDR 
02-03 17:25:26.214 I/Wi-Fi network state: OBTAINING_IPADDR 
02-03 17:25:26.219 I/Wi-Fi network state: CONNECTING 
02-03 17:25:26.221 I/Wi-Fi network state: OBTAINING_IPADDR 
02-03 17:25:28.292 I/Wi-Fi network state: CAPTIVE_PORTAL_CHECK 
02-03 17:25:28.297 I/Wi-Fi network state: CAPTIVE_PORTAL_CHECK 
02-03 17:25:28.304 I/Wi-Fi network state: CONNECTED 
02-03 17:25:28.312 I/Wi-Fi network state: CONNECTED 
02-03 17:30:32.400 I/Wi-Fi network state: CONNECTED 

謝謝!

編輯1:

我能解決使用簡單的一招的問題:每次我有切換到另一個Wi-Fi網絡的時候,我知道它的ID。所以我知道當收到廣播時,連接已完成,網絡狀態已連接,並且當前網絡具有預期ID。像這樣:

public void onReceive(Context context, Intent intent) { 
    NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 

    if (info.getState() == NetworkInfo.State.CONNECTED) { 
     WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 

     if (wifiManager == null) return; 

     WifiInfo connection = wifiManager.getConnectionInfo(); 

     if (connection != null && connection.getNetworkId() == expectedId) { 
      // Connection complete! 
     } 
    } 
} 

不過,問題仍然存在。爲什麼我的應用程序會收到廣播,指示網絡已連接,而事實上我正在斷開連接?

回答

2

嘗試編寫一個外部類來檢查來自當前上下文的連接,而不是從Intent檢查連接。

/* 
* True if network available else FALSE 
*/ 
public static boolean isNetwork(Context mContext) { 
    ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
    return activeNetwork != null && activeNetwork.isConnected(); 
} 

,並從BroadcastReceiver嘗試調用上述方法確定INTERNET的可用性。

+0

我正在測試您的解決方案,看起來很有前途。但是,不建議使用ConnectivityManager中的getAllNetworkInfo()方法。 – Milack27

+0

我使用了你發佈的類,但所有對'isConnectingToInternet()'的調用都返回了false。我嘗試了一些變化,避免了被棄用的方法,但沒有任何成功。無論如何,感謝您的幫助! – Milack27

+1

@Milack:我已經更改了代碼,請檢查編輯後的答案。 – theapache64