在我的应用程序中,我有一个通过<receiver>
标签作为组件启动的BroadcastReceiver
,用于过滤android.net.conn.CONNECTIVITY_CHANGE
意图。
我的目标很简单,就是知道无线连接是什么时候建立的,所以我在onReceive()
中做的事情是:
NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) {
// Wifi is connected
}
它工作得很好,但当Wifi连接建立时,我似乎总是在大约一秒钟内得到两个相同的意图。我试图查看我能从intent、ConnectivityManager
和WifiManager
获得的任何信息,但我找不到任何区分这两个intent的信息。
查看日志,至少有一个其他BroadcastReceiver
也接收了两个相同的意图。
它运行在HTC Desire和Android2.2上
你知道为什么当Wifi连接时,我似乎得到了一个“重复”的意图吗?或者两者之间的区别是什么?
发布于 2019-02-06 00:29:31
这是在API 21和更高版本上注册连接更改的正确方法。下面的代码可以放在一个基础活动中,这样你就可以期望你的应用程序中的每个屏幕(从这个活动继承)都能得到这些回调。
首先,创建一个网络回调,它将监视连接更改。
@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)
}
}
然后,在相关位置注册和注销该回调。
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)
}
}
并在适当的时候注销。
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,请务必为如何处理棒棒糖之前的设备中的网络状态更改制定计划。
发布于 2013-06-25 14:29:08
更新了Torsten的代码,以便当WIFI断开连接时,只对单个适当的广播进行操作。
已使用NetworkInfo.getDetailedState() == DetailedState.DISCONNECTED进行检查。
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));
}
}
}
发布于 2011-05-05 05:49:04
如果您已将该活动注册为意图侦听器,则您将收到两次相同的消息。具体地说,您需要选择是在包级别(XML)还是在编程级别进行侦听。
如果您为广播接收器设置了一个类,并附加了监听,并且将意图过滤器附加到活动,则消息将被复制两次。
我希望这能解决你的问题。
https://stackoverflow.com/questions/5276032
复制相似问题