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

J1a*_*nd1 31 android android-service

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

nul*_*ent 60

你需要

<intent-filter>
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
<action android:name="android.net.wifi.STATE_CHANGE"/>
</intent-filter>
Run Code Online (Sandbox Code Playgroud)

在你的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);
Run Code Online (Sandbox Code Playgroud)

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" />
Run Code Online (Sandbox Code Playgroud)

要检查连接性,您可以使用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);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢iccthedral.作为传递给过滤器的字符串文字的替代方法,WifiManager.WIFI_STATE_CHANGED_ACTION和WifiManager.NETWORK_STATE_CHANGED_ACTION是WifiManager.class中的等效定义. (4认同)
  • 我认为这只会给我们WIFI适配器的连接变化.我想在移动数据连接发生变化时收到通知. (2认同)

Dan*_*ian 5

这是我在连接发生变化时收到通知的方法.您定义a 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<receiver android:name=".NetworkChangeReceiver" >
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

来源于

  • @Nicholas它没有被弃用.您只需在代码中创建广播接收器,而不是在清单文件中. (3认同)