为了账号安全,请及时绑定邮箱和手机立即绑定

wifi或3g网络状态更改时的BroadcastReceiver

/ 猿问

wifi或3g网络状态更改时的BroadcastReceiver

MYYA 2019-11-15 12:37:35

我有一个应用程序,每当手机连接到WiFi时,该应用程序都会更新数据库。我已经实现了ServiceBroadcastReceiver可以运行Service(它会告诉我正在使用什么网络),但是问题是我不知道要在网络状态更改或何时连接到某种网络时在manifest文件中添加什么内容来启动BroadcastReceiver。网络的



查看完整描述

3 回答

?
holdtom

你需要


<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对象的形式提供了新状态。如果新状态为已连接,则其他附加项可能会提供接入点的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);


查看完整回答
反对 回复 2019-11-15
?
三国纷争

这是我要在连接更改时得到通知的方法。您定义一个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>


查看完整回答
反对 回复 2019-11-15
?
白板的微信

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



查看完整回答
反对 回复 2019-11-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信