ACTION意图在Wifi连接时收到两次
在我的应用程序中,我有一个BroadcastReceiver
,通过<receiver>
标记作为组件启动,过滤android.net.conn.CONNECTIVITY_CHANGE
意图。
我的目标是简单地知道什么时候建立了Wifi连接,所以我在onReceive()
做的是这样的:
NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) {
// Wifi is connected
}
它工作正常,但我似乎总是在建立Wifi连接时在约一秒内得到两个相同的意图。 我试图查看任何可以从intent, ConnectivityManager
和WifiManager
,但我找不到任何区分这两种意图的信息。
查看日志,至少有另一个BroadcastReceiver
也收到两个相同的意图。
它运行在Android 2.2上的HTC Desire上
任何想法为什么我似乎得到一个“重复”的意图,当Wifi连接或两者之间的差异可能是什么?
经过大量的搜索和调试,我相信这是确定Wifi是否连接或断开连接的正确方法。
BroadcastReceiver中的onReceive()
方法:
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.getType() == ConnectivityManager.TYPE_WIFI &&
! networkInfo.isConnected()) {
// Wifi is disconnected
Log.d("Inetify", "Wifi is disconnected: " + String.valueOf(networkInfo));
}
}
}
与AndroidManifest.xml中的以下接收器元素一起使用
<receiver android:name="ConnectivityActionReceiver"
android:enabled="true" android:label="ConnectivityActionReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
<action android:name="android.net.wifi.STATE_CHANGE"/>
</intent-filter>
</receiver>
一些解释:
当仅考虑ConnectivityManager.CONNECTIVITY_ACTION
,当Wifi连接时,我总是得到包含相同NetworkInfo实例的两个intent(getType()== TYPE_WIFI和isConnected()== true) - 此问题中描述的问题。
当仅使用WifiManager.NETWORK_STATE_CHANGED_ACTION
,在Wifi断开连接时没有意图广播,但是包含不同NetworkInfo实例的两个意图允许在连接Wifi时确定一个事件。
注意:我收到了一个崩溃报告(NPE),其中intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO)
返回null。 所以,即使这种情况发生的可能性非常小,添加一个空检查可能是一个好主意。
干杯,Torsten
如果你正在监听WifiManager.NETWORK_STATE_CHANGED_ACTION
你会收到两次,因为NetworkInfo
有两种方法
isConnectedOrConnecting()
isConnected()
第一次isConnectedOrConnecting()
返回true
并且isConnected()
false
第二次isConnectedOrConnecting()
和isConnected()
返回true
干杯
如果您将活动注册为意向倾听者,那么您将收到相同的消息两次。 具体而言,您需要选择是否要在包级别(XML)或编程级别上进行监听。
如果您为广播接收者设置了一个类并附加监听,并且您将一个意图过滤器附加到该活动,则该消息将被复制两次。
我希望这能解决你的问题。
链接地址: http://www.djcxy.com/p/59935.html上一篇: ACTION intent received twice when Wifi connected
下一篇: Problem connecting Android app to socket using cell connection