The*_*Bat 5 android android-networking android-activity android-broadcast android-broadcastreceiver
我暂时面对这个问题并注意到其他一些人也遇到过这个问题,但我无法解决它.
问题
我有一个BroadcastReceiver,它一直在监听互联网的变化.因此,无论何时连接或断开互联网,我都会获得onReceive接收器的状态.
问题是它总是被调用两次.当我连接调试器并在代码中有断点时,我可以看到它被调用两次但我的状态更改代码执行.未连接调试器时,在这种情况下,我的状态更改代码根本不会执行.
我的守则
BroadcastReceiver文件
public class ConnectivityReceiver
extends BroadcastReceiver {
public static ConnectivityReceiverListener connectivityReceiverListener;
public ConnectivityReceiver() {
super();
}
@Override
public void onReceive(Context context, Intent arg1) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null
&& activeNetwork.isConnectedOrConnecting();
if (connectivityReceiverListener != null) {
connectivityReceiverListener.onNetworkConnectionChanged(isConnected);
}
}
public static boolean isConnected() {
ConnectivityManager
cm = (ConnectivityManager) MyApplication.getInstance().getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return activeNetwork != null
&& activeNetwork.isConnectedOrConnecting();
}
public interface ConnectivityReceiverListener {
void onNetworkConnectionChanged(boolean isConnected);
}
}
Run Code Online (Sandbox Code Playgroud)
表现意图行动
<receiver
android:name=".utils.ConnectivityReceiver"
android:enabled="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
在这里,当我尝试只<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />使用过滤器,然后它来了onRecieve两次.当我尝试时<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />,我根本没有来onReceive.
BaseActivity
@Override
public void onNetworkConnectionChanged(boolean isConnected) {
setNetworkIndicator(isConnected); //THE CODE TO EXECUTE ON STATUS CHANGE
}
Run Code Online (Sandbox Code Playgroud)
我尝试了现有的答案,但它对我不起作用.
对于Android 7及更高版本,您需要在活动文件中而不是清单文件中注册接收器。
因此,在您的活动的onCreate()中添加以下行:
myConnectivityReceiver = new ConnectivityReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(getResources().getString(R.string.action_connectivity_change));
registerReceiver(myConnectivityReceiver,filter);
Run Code Online (Sandbox Code Playgroud)
并在onDestroy()中
@Override
protected void onDestroy() {
unregisterReceiver(myConnectivityReceiver);
super.onDestroy();
}
Run Code Online (Sandbox Code Playgroud)
在 strings.xml 中定义意图操作
<string name="action_connectivity_change">android.net.conn.CONNECTIVITY_CHANGE</string>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
388 次 |
| 最近记录: |