首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当Wifi连接时收到两次CONNECTIVITY_ACTION意图

当Wifi连接时收到两次CONNECTIVITY_ACTION意图
EN

Stack Overflow用户
提问于 2011-03-12 01:11:16
回答 9查看 51K关注 0票数 52

在我的应用程序中,我有一个通过<receiver>标签作为组件启动的BroadcastReceiver,用于过滤android.net.conn.CONNECTIVITY_CHANGE意图。

我的目标很简单,就是知道无线连接是什么时候建立的,所以我在onReceive()中做的事情是:

代码语言:javascript
运行
复制
NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) {
    // Wifi is connected
}

它工作得很好,但当Wifi连接建立时,我似乎总是在大约一秒钟内得到两个相同的意图。我试图查看我能从intent、ConnectivityManagerWifiManager获得的任何信息,但我找不到任何区分这两个intent的信息。

查看日志,至少有一个其他BroadcastReceiver也接收了两个相同的意图。

它运行在HTC Desire和Android2.2上

你知道为什么当Wifi连接时,我似乎得到了一个“重复”的意图吗?或者两者之间的区别是什么?

EN

回答 9

Stack Overflow用户

发布于 2019-02-06 00:29:31

这是在API 21和更高版本上注册连接更改的正确方法。下面的代码可以放在一个基础活动中,这样你就可以期望你的应用程序中的每个屏幕(从这个活动继承)都能得到这些回调。

首先,创建一个网络回调,它将监视连接更改。

代码语言:javascript
运行
复制
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private val networkCallback: ConnectivityManager.NetworkCallback = object : ConnectivityManager.NetworkCallback() {

    // Implement the callback methods that are relevant to the actions you want to take.
    // I have implemented onAvailable for connecting and onLost for disconnecting.

    override fun onAvailable(network: Network?) {
        super.onAvailable(network)
    }

    override fun onLost(network: Network?) {
        super.onLost(network)
    }
}

然后,在相关位置注册和注销该回调。

代码语言:javascript
运行
复制
override fun onResume() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager
        cm?.registerNetworkCallback(NetworkRequest.Builder().build(), networkCallback)
    }
}

并在适当的时候注销。

代码语言:javascript
运行
复制
override fun onPause() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager
        cm?.unregisterNetworkCallback(networkCallback)
    }
}

请注意,其中选中了Build.VERSION_CODES.LOLLIPOP。此功能仅在棒棒糖及更高版本中可用。如果您的应用程序中支持的API低于21,请务必为如何处理棒棒糖之前的设备中的网络状态更改制定计划。

票数 7
EN

Stack Overflow用户

发布于 2013-06-25 14:29:08

更新了Torsten的代码,以便当WIFI断开连接时,只对单个适当的广播进行操作。

已使用NetworkInfo.getDetailedState() == DetailedState.DISCONNECTED进行检查。

代码语言:javascript
运行
复制
public void onReceive(final Context context, final Intent intent) {
    if (intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
        NetworkInfo networkInfo = intent
            .getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
        if (networkInfo.isConnected()) {
            // Wifi is connected
            Log.d("Inetify","Wifi is connected: " + String.valueOf(networkInfo));
        }
    } else if (intent.getAction().equals(
        ConnectivityManager.CONNECTIVITY_ACTION)) {
        NetworkInfo networkInfo = intent
            .getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
        if (networkInfo.getDetailedState() == DetailedState.DISCONNECTED) {
            // Wifi is disconnected
            Log.d("Inetify","Wifi is disconnected: "+String.valueOf(networkInfo));
        }
    }
}
票数 4
EN

Stack Overflow用户

发布于 2011-05-05 05:49:04

如果您已将该活动注册为意图侦听器,则您将收到两次相同的消息。具体地说,您需要选择是在包级别(XML)还是在编程级别进行侦听。

如果您为广播接收器设置了一个类,并附加了监听,并且将意图过滤器附加到活动,则消息将被复制两次。

我希望这能解决你的问题。

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

https://stackoverflow.com/questions/5276032

复制
相关文章

相似问题

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