首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >wifi或3g网络状态改变时的BroadcastReceiver

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

Stack Overflow用户
提问于 2012-05-24 15:35:46
回答 5查看 56.6K关注 0票数 34

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-24 15:40:39

你需要

代码语言:javascript
运行
复制
<intent-filter>
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
<action android:name="android.net.wifi.STATE_CHANGE"/>
</intent-filter>

在您的receiver标签中。

或者,如果您想要对其进行更多控制,请在注册BroadcastReceiver之前设置以下内容:

代码语言:javascript
运行
复制
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

表示Wi-Fi连接状态已更改的广播<intent-action>。一个额外的以NetworkInfo对象的形式提供新状态。如果新状态已连接,则其他附加设备可能会提供接入点的BSSID和WifiInfo。作为字符串

此外,您还需要在manifest标记中指定正确的权限:

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

要检查连接,您可以使用ConnectivityManager,因为它会告诉您可用的连接类型。

代码语言:javascript
运行
复制
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);
票数 64
EN

Stack Overflow用户

发布于 2015-07-21 19:53:30

这就是我在连接发生变化时得到通知的方法。您需要定义一个BroadCastReceiver来接收广播。

代码语言:javascript
运行
复制
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进行过滤。

代码语言:javascript
运行
复制
<receiver android:name=".NetworkChangeReceiver" >
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
</receiver>

here

票数 5
EN

Stack Overflow用户

发布于 2017-09-22 00:16:24

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

指向源here的链接

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10733121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档