广播接收器,当WiFi或3G网络状态改变广播接收器,当WiFi或3G网络状态改变(Broadcast

2019-05-14 12:08发布

我有一个应用程序,它更新每当手机连接到无线网络的数据库。 我实现了一个ServiceBroadcastReceiver将运行Service (它会告诉我是什么用网络),但问题是我不知道是什么在添加manifest文件,以启动BroadcastReceiver时,网络状态的改变或在它连接到某些类型的网络

Answer 1:

你需要

<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>指示无线网络连接已被启用,禁用启用,禁用或未知。 一个额外提供了这种状态为int。 另额外提供了以前的状态,如果有的话。

STATE_CHANGE

广播<intent-action>指示Wi-Fi连接的状态已经改变了。 一个额外提供的NetworkInfo对象的形式,新的状态。 如果新的状态连接,额外的附加可以提供接入点的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);


Answer 2:

这是我做什么来得到通知时,连接已经改变。 你定义一个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>

来源这里



Answer 3:

你应该做的BroadcastReceiver ,当连接状态已经改变,将触发:

这里同样的问题, 如何检查在整个应用程序的Internet连接定期?



Answer 4:

为了补充@ Dantalian的答案。 与Android牛轧糖开始,你不应该宣布你对你的清单接收器,因为它不会收到CONNECTIVITY_ACTION广播。 而应该注册使用该接收机Context.registerReceiver(Receiver, Intent)方法。

链接到源在这里



Answer 5:

声明意图过滤传递到广播接收器

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

    }
};


文章来源: BroadcastReceiver when wifi or 3g network state changed