34

我有一个应用程序,只要手机连接到 WiFi,它就会更新数据库。我已经实现了一个Service并且BroadcastReceiver它将运行Service(它会告诉我正在使用哪个网络),但问题是我不知道当网络状态发生变化或连接到某种类型时要在manifest文件中添加什么来启动BroadcastReceiver网络的

4

5 回答 5

64

你需要

<intent-filter>
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
<action android:name="android.net.wifi.STATE_CHANGE"/>
</intent-filter>

在你的receiver标签中。

或者,如果您想对其进行更多控制,请在注册之前进行BroadcastReceiver设置:

final IntentFilter filters = new IntentFilter();
filters.addAction("android.net.wifi.WIFI_STATE_CHANGED");
filters.addAction("android.net.wifi.STATE_CHANGE");
super.registerReceiver(yourReceiver, filters);

WIFI_STATE_CHANGED

广播<intent-action>指示 Wi-Fi 已启用、禁用、启用、禁用或未知。一个额外的提供这种状态作为一个 int。如果可用,另一个额外提供先前的状态。

STATE_CHANGE

广播<intent-action>指示 Wi-Fi 连接状态已更改。一个额外的以 NetworkInfo 对象的形式提供了新的状态。如果新状态为 CONNECTED,则额外的附加信息可能会提供接入点的 BSSID 和 WifiInfo。作为字符串

此外,您需要在manifest标签内指定正确的权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

要检查连接,您可以使用ConnectivityManager它告诉您可用的连接类型。

ConnectivityManager conMngr = (ConnectivityManager)this.getSystemService(this.CONNECTIVITY_SERVICE);
android.net.NetworkInfo wifi = conMngr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
android.net.NetworkInfo mobile = conMngr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
于 2012-05-24T07:40:39.237 回答
5

这是我在连接更改时收到通知的方法。您定义一个BroadCastReceiver来接收广播。

public class NetworkChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

        boolean isConnected = wifi != null && wifi.isConnectedOrConnecting() ||
            mobile != null && mobile.isConnectedOrConnecting();
        if (isConnected) {
            Log.d("Network Available ", "YES");
        } else {
            Log.d("Network Available ", "NO");
        }
    }
}

您还必须BroadcastReceiver在清单文件中定义它并按ConnectivityChange.

<receiver android:name=".NetworkChangeReceiver" >
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
</receiver>

来源在这里

于 2015-07-21T11:53:30.040 回答
2

补充@Dantalian的回答。从 Android Nougat 开始,您不应在 Manifest 上声明您的接收器,因为它不会接收CONNECTIVITY_ACTION广播。您应该使用该Context.registerReceiver(Receiver, Intent)方法注册您的接收器。

链接到这里的源代码

于 2017-09-21T16:16:24.060 回答
1

You should make an BroadcastReceiver that will be triggered when the connectivity status has changed :

Here Same question How to check the Internet Connection periodically in whole application?

于 2012-05-24T07:53:34.980 回答
1

声明要传递给广播接收器的意图过滤器

IntentFilter filter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
registerReceiver(mReceiver, filter);

在广播接收器中,检查 EXTRA_WIFI_STATE;

private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        switch (action)
        {
            case WifiManager.WIFI_STATE_CHANGED_ACTION:
                int extra = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,0);
                if(extra==WifiManager.WIFI_STATE_ENABLED)
                {

                }//...else WIFI_STATE_DISABLED, WIFI_STATE_DISABLING, WIFI_STATE_ENABLING
                break;
        }

    }
};
于 2018-07-30T14:04:43.633 回答