2017-09-02 61 views
5

在我的應用程序中,只要設備連接或斷開WIFI網絡,我就必須得到通知。爲此,我必須使用BroadcastReceiver,但是在閱讀了不同的文章和問題後,我對此有點困惑,我應該使用這種廣播操作。在我看來,我有三個選擇:WIFI變化的廣播動作

減少資源我真的只是想獲得通知當器件處於CONNECTED到WiFi網絡(和它已經收到一個IP地址)或者當設備有一個DISCONNECTED。我不在乎其他國家,如CONNECTING

那麼你認爲是最好的廣播行動,我應該用這個?我是否必須對onReceive中的事件進行手動過濾(因爲我接受了更多的CONNECTEDDISCONNECTED)?

編輯:正如我在下面的評論中指出的,我認爲SUPPLICANT_CONNECTION_CHANGE_ACTION將是我的最佳選擇,但它永遠不會被我的應用程序解僱或收到。 Others與此廣播有同樣的問題,但從未提出真正的解決方案(實際上使用其他廣播)。任何想法?

+0

哪裏歧義? SUPPLICANT_CONNECTION_CHANGE_ACTION的Android文檔中明確指出「廣播意圖操作表明與申請者的連接已建立(現在可以執行Wi-Fi操作),或者與請求者的連接已經丟失,另外一個提供連接狀態爲一個布爾值,其中true表示CONNECTED。「其餘的意圖有額外的可以告訴你Wifi狀態或完整的NetworkInfo對象攜帶更改的網絡信息。 我認爲使用(1)給你的要求是相當不錯的。 –

+0

你是對的,但問題是'SUPPLICANT_CONNECTION_CHANGE_ACTION'從來沒有被我的應用程序接收到,當我在其他問題中讀到時,這是一個常見問題。據我所知,並非所有的手機都在發射這種廣播。 – Cilenco

+0

那麼你應該毫無疑問地使用其餘兩個廣播中的任何一個,如果他們爲你工作的話。 –

回答

1

請嘗試

@Override 
protected void onResume() { 
    super.onResume(); 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); 
    filter.addAction("android.net.wifi.STATE_CHANGE"); 
    registerReceiver(networkChangeReceiver, filter); 
} 

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

BroadcastReceiver networkChangeReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     if (!AppUtils.hasNetworkConnection(context)) { 
      showSnackBarToast(getNetworkErrorMessage()); 
     } 

    } 
}; 

我使用這一點,它爲我工作。希望它能幫助你。

+0

謝謝,但我知道如何做到這一點。真正的問題是,如果這個IntentFilter(使用的動作)是最好的解決方案,只有連接和斷開事件。 – Cilenco

1

你可以去WifiManager.NETWORK_STATE_CHANGED_ACTION works.

註冊接收機WifiManager.NETWORK_STATE_CHANGED_ACTION行動,無論是在清單或片段或活動,這曾經適合你。

覆蓋接收器:

@Override 
public void onReceive(Context context, Intent intent) { 

    final String action = intent.getAction(); 

    if(action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){ 
     NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 
     boolean connected = info.isConnected(); 
     if (connected) 
     //call your method 
    }  
}