Android判断网络连接、监控网络状态

QuibblerQuibbler 2020-01-23 约 22 分钟 3067 次阅读

Android判断网络连接、监控网络状态

1、判断网络状态

通过ConnectivityManager和NetworkInfo进行相关网络状态的判断。需要相应的权限。

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

1.1、当前手机是否有网络连接

/**
     * @param context 传入上下文
     * @return 当前手机是否有网络连接
     */
    public boolean isNetworkConnected(Context context) {
        if (null != context) {
            ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if (null != networkInfo) {
                return networkInfo.isAvailable();
            }
        }
        return false;
    }

1.2、WiFi网络是否可用

/**
     * @param context 传入上下文
     * @return WiFi网络是否可用
     */
    public boolean isWifiConnected(Context context) {
        if (null != context) {
            ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo wifiNetworkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            if (null != wifiNetworkInfo) {
                return wifiNetworkInfo.isAvailable();
            }
        }
        return false;
    }

1.3、当前手机移动网络是否可用

/**
     * @param context 传入上下文
     * @return 返回当前手机移动网络是否可用
     */
    @SuppressWarnings("deprecation")
    public boolean isMobileConnected(Context context) {
        if (null != context) {
            ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mobileNetworkinfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
            if (null != mobileNetworkinfo) {
                return mobileNetworkinfo.isAvailable();
            }
        }
        return false;
    }


1.4、当前网络连接的类型

/**
     * @param context 传入上下文
     * @return 返回当前网络连接的类型,诸如{@link ConnectivityManager#TYPE_WIFI,ConnectivityManager#TYPE_MOBILE}等等
     */
    @RequiresPermission(Manifest.permission.ACCESS_NETWORK_STATE)
    public int getConnectedTye(Context context) {
        if (null != context) {
            ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if (null != networkInfo && networkInfo.isAvailable()) {
                return networkInfo.getType();
            }
        }
        return -1;
    }

上面的那些方法目前为止都还可以使用(@SuppressWarnings("deprecation")),不过已经被Android官方标记为deprecated不再推荐使用。推荐使用ConnectivityManager.NetworkCallback替代NetworkInfo获取网络状态。


1.5、新的API判断网络连接

Android已经将NetworkInfo标记为deprecated,尽量避免使用。

①网络是否已连接

/**
     * 网络是否已连接
     *
     * @return true:已连接 false:未连接
     */
    @SuppressWarnings("deprecation")
    @RequiresPermission(ACCESS_NETWORK_STATE)
    public static boolean iConnected(@NonNull Context context) {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (manager != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                NetworkCapabilities networkCapabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
                if (networkCapabilities != null) {
                    return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                            || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
                            || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET);
                }
            } else {
                NetworkInfo networkInfo = manager.getActiveNetworkInfo();
                return networkInfo != null && networkInfo.isConnected();
            }
        }
        return false;
    }

②Wifi是否已连接

/**
     * Wifi是否已连接
     *
     * @return true:已连接 false:未连接
     */
    @SuppressWarnings("deprecation")
    public static boolean isWifiConnected(@NonNull Context context) {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (manager != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                NetworkCapabilities networkCapabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
                if (networkCapabilities != null) {
                    return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
                }
            } else {
                NetworkInfo networkInfo = manager.getActiveNetworkInfo();
                return networkInfo != null && networkInfo.isConnected() && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
            }
        }
        return false;
    }

③是否为移动网络

/**
     * 是否为流量
     */
    @SuppressWarnings("deprecation")
    public static boolean isMobileData(@NonNull Context context) {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (manager != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                NetworkCapabilities networkCapabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
                if (networkCapabilities != null) {
                    return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
                }
            } else {
                NetworkInfo networkInfo = manager.getActiveNetworkInfo();
                return networkInfo != null && networkInfo.isConnected() && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
            }
        }
        return false;
    }

2、监听网络状态

通常网络状态发生变化的时候需要进行对应的处理。比如播放视频、音乐的时候网络突然断开或者切换到移动网络,就需要暂停播放。断网之后恢复网络继续播放。

有两种方法,一种Android 5.0之前通过监听网络变化时发出的广播。另一种推荐使用的方法是通过ConnectivityManager.NetworkCallback注册网络状态回调。

2.1、通过BroadcastReceiver监听

先定义一个广播,在onReceive()方法中处理网络变化的逻辑。一般还需要进行网络状态的判断,网络变化时断开还是连接网络。

private BroadcastReceiver mNetChangeReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (NET_CHANGE_ACTION.equals(action)) {
                //业务逻辑
            }
        }
    };

监听网络发生变化发出的广播android.net.conn.CONNECTIVITY_CHANGE

public static final String NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";

在onResume()中注册广播监听器,在onPause()中反注册。

2.2、通过ConnectivityManager.NetworkCallback回调

继承ConnectivityManager.NetworkCallback类,重写onAvailable()、onLost()、onCapabilitiesChanged()等方法。这些方法在父类ConnectivityManager.NetworkCallback中都是空方法。

private ConnectivityManager.NetworkCallback mNetworkCallback = new ConnectivityManager.NetworkCallback() {

        public void onAvailable(@NonNull Network network) {
            super.onAvailable(network);
        }

        public void onLosing(@NonNull Network network, int maxMsToLive) {
            super.onLosing(network, maxMsToLive);
        }

        public void onLost(@NonNull Network network) {
            super.onLost(network);
        }

        public void onUnavailable() {
            super.onUnavailable();
        }

        public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
            super.onCapabilitiesChanged(network, networkCapabilities);
        }

        public void onLinkPropertiesChanged(@NonNull Network network, @NonNull LinkProperties linkProperties) {
            super.onLinkPropertiesChanged(network, linkProperties);
        }

        public void onBlockedStatusChanged(@NonNull Network network, boolean blocked) {
            super.onBlockedStatusChanged(network, blocked);
        }
    }

1、要想监听网络的连接和断开,应该在onAvailable()和onLost()中,成对出现。

2、其他的几个回调使用场景会少一点,并且onCapabilitiesChanged()会回调多次,所以使用它时我们要慎重,避免重复的操作,但是可以保证最后一次回调,网络的连接一定是连接成功的。

通过ConnectivityManager注册ConnectivityManager.NetworkCallback回调监听接口

mConnectivityManager.registerNetworkCallback(new NetworkRequest.Builder().build(), mNetworkCallback);

回调也需要对应的进行反注册

mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);

在ConnectivityManager.NetworkCallback的回调方法中不能操作UI,尽管是在Activity定义的全局匿名内部类,在TextView中显示网络变化提示的时候会出现奔溃。

推荐博客:

        Android 网络请求、网络状态及各种权限判断

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w