分享

Android:BroadcastReceive实现网络状态实时监听

 太极混元天尊 2018-05-30

前言:最近公司项目重构,为了提高用户的体验,项目中要求添加当前网络状态的实时监听,以便在无网络状态时给用户友好的提醒并修改UI界面。本文将介绍使用四大组件之一的BroadcastReceiver实现全局的网络状态监听,使用动态方式注册。

BroadcastReceiver的注册方式:

(1)动态注册:即在代码中使用registerReceiver()方法进行注册,动态注册需要在onPause或onDestory方法中反注册,不然会出现泄露。

(2)静态注册:在清单文件的application节点下通过标签声明,系统首次启动时会自动注册。

效果图:

  

1.定义网络状态监听接口及方法


/** * 网络状态类型改变的监听接口 */public interface NetStatusMonitor { void onNetChange(boolean netStatus);}/** * 设置网络状态监听接口 */public void setStatusMonitor(NetStatusMonitor netStatusMonitor) { this.netStatusMonitor = netStatusMonitor;}

2.网络状态工具类


/** * Created by ruancw on 2018/5/27. * 网络状态工具类 */public class NetUtil { //网络未连接    private static final boolean NETWORK_NONE = false;    //移动数据或无线网络连接    private static final boolean NETWORK_AVAILABLE = true;    /**     * 获取当前网络状态     * @param context 上下文对象     * @return boolean     */    public static boolean getNetStatus(Context context) { // 获取系统连接管理器对象        ConnectivityManager connectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE);        //获取网络状态信息        NetworkInfo activeNetworkInfo = connectivityManager != null ? connectivityManager .getActiveNetworkInfo() : null;        //判断网络NetworkInfo是否不为空且连接        if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) { //网络连接可用            return NETWORK_AVAILABLE;                  } else { return NETWORK_NONE;//网络不可用(未连接)        }    }}

3.定义NetBroadcastReceiver

NetBroadcastReceiver继承自BroadcastReceiver,并重写onReceive方法


/** * Created by ruancw on 2018/5/27. * 用于实时监听app的网络状态 */public class NetBroadcastReceiver extends BroadcastReceiver { //网络状态监听接口    private NetStatusMonitor netStatusMonitor;    @Override    public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { //获取网络状态的类型            boolean netStatus = NetUtil.getNetStatus(context);            if (netStatusMonitor != null) // 接口传递网络状态的类型到注册广播的页面                netStatusMonitor.onNetChange(netStatus);        } } /**     * 网络状态类型改变的监听接口     */    public interface NetStatusMonitor { void onNetChange(boolean netStatus);    } /**     * 设置网络状态监听接口     */    public void setStatusMonitor(NetStatusMonitor netStatusMonitor) { this.netStatusMonitor = netStatusMonitor;    }}

4.BaseActivity中注册

(1)BaseActivity实现网络状态监听接口

(2)onStart中注册广播


@Overrideprotected void onStart() { super.onStart();    //注册网络状态监听的广播    registerBroadcastReceiver();}
/** * 注册网络状态广播 */private void registerBroadcastReceiver() { //注册广播    if (netBroadcastReceiver == null) { netBroadcastReceiver = new NetBroadcastReceiver();        IntentFilter filter = new IntentFilter();        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);        registerReceiver(netBroadcastReceiver, filter);        //设置监听        netBroadcastReceiver.setStatusMonitor(this);    }}

(3)onPause或onDestory中取消注册


@Overrideprotected void onDestroy() { super.onDestroy();     if (netBroadcastReceiver != null) { //注销广播        unregisterReceiver(netBroadcastReceiver);    }}

(4)重写网络监听接口方法


@Overridepublic void onNetChange(boolean netStatus) { this.netStatus = netStatus;    isNetConnect();}
/** * 监听网络状态做出相应改变 */private void isNetConnect() { Message message=new Message();    if (netStatus){ message.what=99;        handler.sendMessage(message);    }else { UIUtil.toast('当前网络不可用');        message.what=100;        handler.sendMessage(message);    }}

(5)主线程修改UI


@SuppressLint('HandlerLeak')Handler handler = new Handler(){ @Override    public void handleMessage(Message msg) { super.handleMessage(msg);        if (msg.what==100){ tvNet.setVisibility(View.VISIBLE);        }else { tvNet.setVisibility(View.GONE);        } }};

这样就实现了全局网络状态监听,并在主线程修改UI界面。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多