不用BroadcastReceiver,纯使用service来达到实时监听系统网络状态

1 缘由

最近笔者在学Android开发课,有一个上机作业的要求就是“不用BroadcastReceiver,纯使用service来达到实时监听系统网络状态”,笔者查了半天的CSDN、博客园……结果千篇一律使用BroadcastReceiver来达到实时监听系统网络状态,没有纯使用service来监听网络状态,于是便有了本篇博文。
原创作品,转载请声明!

2 效果演示

有网络的时候,正常显示
不用BroadcastReceiver,纯使用service来达到实时监听系统网络状态_第1张图片
无网络的时候,显示textView,提示没网络

不用BroadcastReceiver,纯使用service来达到实时监听系统网络状态_第2张图片

3 功能分析

由于题目不允许直接使用BoardcastReceiver去获取信息,所以我们只能使用服务Service去不停获取网络状态,大致思路如下:

  1. 创建一个NetStatusService服务
  2. 定义一个回调接口Callback,声明回调事件onNetworkChange
  3. 在服务中的onCreate方法中创建一个线程,循环获取网络状态,判断网路是否连接,同时调用callback的onNetworkChange,触发回调事件
  4. 定义一个内部类MyBinder、实现getService()方法,同时在回调函数onBind()中创建该内部类MyBinder
  5. 在活动类中,创建ServiceConnection对象,在onServiceConnected方法中,获取服务Service同时实现Callback接口,在onNetworkChange方法中,获取与Service通信的网络状态信息,并根据信息从而判断是否显示“未连接”的TextView,显示给用户。
  6. 在onStart()回调函数中绑定服务。

4 详细设计

4.1 获取网络状态

private boolean isNetworkConnected(Context context) {
     
    if (context != null) {
     
        ConnectivityManager mConnectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
        if (mNetworkInfo != null) {
     
            return mNetworkInfo.isAvailable();
        }
    }
    return false;
}

4.2 判断网络状态是否发生变化的线程

该模块放在onCreate中,具体代码如下

private boolean isNetConn = true;
private boolean lastNetStatus = true;
private boolean connecting;
@Override
public void onCreate() {
     
    super.onCreate();
    connecting = true;
    new Thread(new Runnable() {
     
        @Override
        public void run() {
     
            while(connecting==true){
     
                if(callback != null){
     
                    if(isNetworkConnected(NetStatusService.this)){
     
                        isNetConn = true;
                    }else{
     
                        isNetConn = false;
                    }
                    //如果状态发生变化,则触发回调函数
                    if(isNetConn!=lastNetStatus){
     
                        callback.onNetworkChange(isNetConn);
                        lastNetStatus = isNetConn;
                    }
                }
            }
        }
    }).start();
}

4.3 Callback 接口

public static interface Callback{
     
    void onNetworkChange(boolean isConn);
}

4.4 ServiceConnection

private ServiceConnection conn = new ServiceConnection() {
     
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
     
        NetStatusService.MyBinder binder = (NetStatusService.MyBinder) service;
        NetStatusService netStatusService = binder.getService();
        netStatusService.setCallback(new NetStatusService.Callback() {
     
            //实现onNetworkChange方法
            @Override
            public void onNetworkChange(boolean isConn) {
     
                Message msg = new Message();
                msg.obj = isConn;
                handler.sendMessage(msg);
                //这里我是用handler来进行更新组件状态
            }
        });
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
     

    }
};

4.5 更新组件状态

//在前端显示
private Handler handler = new Handler(){
     
    @Override
    public void handleMessage(@NonNull Message msg) {
     
        super.handleMessage(msg);
        if((boolean)msg.obj){
     
            netStatusView.setVisibility(View.GONE);
            setTitle("学生信息管理系统");
        }else{
     
            netStatusView.setVisibility(View.VISIBLE);
            setTitle("【网络已断开】");
        }
    }
};

4.6 绑定服务与解绑服务

@Override
protected void onStart() {
     
    super.onStart();
    Intent i = new Intent(this, NetStatusService.class);
    bindService(i,conn,BIND_AUTO_CREATE);
}

@Override
protected void onStop() {
     
    super.onStop();
    unbindService(conn);
}

4 源代码

https://github.com/GoatYoung/issue10A 给颗小星星⭐可否? 嘿嘿

你可能感兴趣的:(service,网络状态,android,网络)