当wifi或3g网络状态改变时,BroadcastReceiver

时间:2012-05-24 07:35:46

标签: android android-service

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

5 个答案:

答案 0 :(得分:59)

你需要

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

答案 1 :(得分: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>

来源here

答案 2 :(得分:1)

当连接状态发生变化时,您应该触发BroadcastReceiver

同样问题How to check the Internet Connection periodically in whole application?

答案 3 :(得分:1)

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

链接到来源here

答案 4 :(得分:0)

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

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

    }
};