Android判断网络状态监听网路状态

Android判断网络状态监听网路状态 | 夕辞

在Android开发过程中,为了用户体验,比如微信等软件,都会在网络不可用或有问题时,提示用户不可用,因此开发者需要判断网络状态并且实时监听,网上也搜了很多方法,比如使用BroadCastReceiver,也有使用ping一个外网链接比如百度的,还有通过DNS连接来判断的,但是发现都不是很好用,尤其是ping的,很不优雅,有时候返回结果还不一定正确。

最后找到一个方法,亲测比较好使,分享出来。

我们上面说到的解决方案,看了下发布时间,一般都是比较早的文章了,其实随着Android迭代,有了更好的替代方式,那就是:ConnectivityManager.NetworkCallback

具体的介绍大家可以参考官方文档:官方链接点击进入》》》

下面我们直接说使用方法:

第一步:新建一个类继承ConnectivityManager.NetworkCallback,并且重写里面的方法(主要是onAvailableonLost)。

public class NetworkStatusCallback extends ConnectivityManager.NetworkCallback {



    private static final String TAG = "NetworkStatusCallback";



    private Context context;

    private ConnectivityManager manager;



    public NetworkStatusCallback(Context context) {

        this.context = context;

        this.manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    }



    @Override

    public void onAvailable(Network network) {

        super.onAvailable(network);

        //调用判断

        isNetworkEnable();

    }



    @Override

    public void onLosing(Network network, int maxMsToLive) {

        super.onLosing(network, maxMsToLive);

    }



    @Override

    public void onLost(Network network) {

        super.onLost(network);

        //调用判断

        isNetworkEnable();

    }



    @Override

    public void onUnavailable() {

        super.onUnavailable();

    }



    @Override

    public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {

        super.onCapabilitiesChanged(network, networkCapabilities);

    }



    @Override

    public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {

        super.onLinkPropertiesChanged(network, linkProperties);

    }



    /**

     * 为什么每次都要判断,原因是WIFI和蜂窝网络都可用时,如果只是断掉WIFI,也会调用onLoss方法,所以改为只判断当前可用的,无论是哪个

     */

    private void isNetworkEnable() {

        NetworkInfo active = manager.getActiveNetworkInfo();

        boolean result = null != active &&

                active.getState() == NetworkInfo.State.CONNECTED;

        //下面根据结果,发送事件或者做业务操作

    }





}

第二步:注册监听(我选择在MyApplication里)。

NetworkStatusCallback listener = new NetworkStatusCallback(getApplicationContext());

ConnectivityManager connMgr = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);

if (connMgr != null) {

    //这里只监听了WIFI和蜂窝网络,正常APP够用了,如果有其他要求,可以增加

    NetworkRequest nr = new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI)

            .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)

            .build();

    connMgr.registerNetworkCallback(nr, listener);

}

以上就完成了网络状态的监听,怎么样,可以试试看是否好用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中,可以通过监听系统的网络状态变化来实现网络连接状态判断。具体实现方式如下: 1. 在 AndroidManifest.xml 文件中添加网络状态权限: ``` xml <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> ``` 2. 在需要监听网络状态变化的地方,注册广播接收器: ``` java IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(networkChangeReceiver, intentFilter); ``` 3. 实现广播接收器类: ``` java public class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isAvailable()) { // 网络已连接 } else { // 网络断开 } } } } ``` 完整代码如下: ``` java public class MainActivity extends AppCompatActivity { private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册广播接收器 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); networkChangeReceiver = new NetworkChangeReceiver(); registerReceiver(networkChangeReceiver, intentFilter); } @Override protected void onDestroy() { super.onDestroy(); // 取消注册广播接收器 unregisterReceiver(networkChangeReceiver); } /** * 网络状态变化广播接收器 */ public static class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isAvailable()) { // 网络已连接 } else { // 网络断开 } } } } } ``` 在以上代码中,我们首先在 onCreate() 方法中注册了一个广播接收器,并指定了监听的广播事件为 ConnectivityManager.CONNECTIVITY_ACTION。然后在广播接收器的 onReceive() 方法中,我们通过 ConnectivityManager 获取当前网络状态,并判断网络是否可用。最后,在 onDestroy() 方法中取消注册广播接收器。 至此,我们就实现了 Android 监听网络状态的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值