在Android 7.0及以上的系统移除了三项隐式广播,其中就有 ConnectivityManager.CONNECTIVITY_ACTION(android.net.conn.CONNECTIVITY_CHANGED)
,这里除了说明Android 7.0的网络监听策略外,也会列出Android 7.0以下版本的网络监听策略。
1 Android 7.0及以上设备网络状态监听
public class MainActivity extends Activity {
private ConnectivityManager mConnectivityManager;
private ConnectivityManager.NetworkCallback mNetworkCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODE.N) {
mNetworkCallback = new NetworkCallbackImpl();
NetworkRequest.Builder builder = new NetworkRequest.Builder();
NetworkRequest request = builder.build();
mConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
mConnectivityManager.registerNetworkCallback(request, mNetworkCallback); // 注册
}
}
@Override
protected void onDestroy() {
mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
super.onDestroy();
}
// 使用最多的两个方法是onAvailable()和onLost(),分别判断网络是否连接或断开
private class NetworkCallbackImpl extends ConnectivityManager.NetworkCallback {
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
}
@Override
public void onLosing(Network network, int maxMsToLive) {
super.onLosing(network, maxMsToLive);
}
@Override
public void onLost(Network network) {
super.onLost(network);
}
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, capabilities);
}
@Override
public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
super.onLinkPropertiesChanged(network, linkProperties);
}
}
}
2 Android 7.0以下设备网络状态监听(动态注册在7.0以上也有效)
- 监听网络状态的广播
public class NetworkReceiver extends BroadcastReceiver {
private static final String TAG = NetworkReceiver.class.getSimpleName();
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
if (NetworkUtils.isNetworkAvailable(context)) {
Log.i(TAG, "network is connected");
} else {
Log.i(TAG, "network is disconnected");
}
}
}
}
- NetworkUtils
public class NetworkUtils {
// networkInfo.isConnected()分析:
// 网络分为三种:有线以太网连接(即接网线)、无线wifi连接、移动网络连接
// 判断网络连接要使用networkInfo.isConnected()判断,这是对三种网络是否处于连接状态的统一判断
// 如果设备无线wifi连接断开了,但是移动网络处于连接状态,isConnected()会返回true
// networkInfo.isConnected()判断到所有的网络都不可用了,才会返回false,且networkInfo != null的判断是必要的
// networkInfo.isAvailable()判断是否连接是不准确的,最好使用networkInfo.isConnected()判断
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected();
}
}
- 在Activity或Service中动态注册(不能使用本地广播,否则无法接收到系统的网络连接状态广播)
ConnectivityManager.CONNECTIVITY_ACTION
系统广播在Android 7.0(Android N)中已经被禁止发送,AndroidManifest.xml静态注册将无法接收到该广播,但是动态注册还是可以监听到。
public class NetworkService extends Service {
private NetworkReceiver mReceiver;
@Override
public void onCreate() {
super.onCreate();
mReceiver = new NetworkReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mReceiver, intentFilter);
}
@Override
public void onDestroy() {
unregisterReceiver(mReceiver);
stopSelf();
super.onDestroy();
}
}
- AndroidManifest.xml声明权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<receiver android:name=".receiver.NetworkReceiver" />
<service android:name=".service.NetworkServie" />