2017-09-02 105 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 
    }  
}