当Wifi或3G网络状态改变时的广播接收器

34
我有一个应用程序,每当手机连接到 WiFi 时就会更新数据库。我已经实现了一个 ServiceBroadcastReceiver,它们将运行该 Service (它将告诉我正在使用哪个网络),但问题是我不知道在 manifest 文件中添加什么来启动 BroadcastReceiver,以便在网络状态改变或连接到某种网络时启动它。
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

Broadcast <intent-action> 指示 Wi-Fi 已启用、禁用、正在启用、正在禁用或未知。一个额外的 int 类型的 extra 提供了此状态。如果可用,另一个额外的 extra 提供了先前的状态。

STATE_CHANGE

Broadcast <intent-action> 指示 Wi-Fi 连接状态已更改。一个额外的 extra 以 NetworkInfo 对象的形式提供新状态。如果新状态为 CONNECTED,则其他额外的 extra 可以提供访问点的 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);

1
我们能否添加一个广播接收器来检查数据连接? - tasomaniac
2
我认为这只会提供WIFI适配器连接的更改。我想在移动数据连接更改时得到通知。 - tasomaniac
4
谢谢 iccthedral。作为传递到过滤器中的字符串文字的替代方案,WifiManager.WIFI_STATE_CHANGED_ACTION和WifiManager.NETWORK_STATE_CHANGED_ACTION是在WifiManager.class中等效的定义。 - pmont

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>

Source here


请注意,从Android N开始,“android.net.conn.CONNECTIVITY_CHANGE”广播已被弃用。文档建议使用“JobScheduler”或“GCMNetworkManager”。 - Nicolás Carrasco-Stevenson
3
@Nicholas,它并没有被弃用。你只需要在代码中创建广播接收器,而不是在清单文件中创建。 - Mr.Noob

2

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

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;
        }

    }
};

2

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

源链接在此


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接