1 缘由
最近笔者在学Android开发课,有一个上机作业的要求就是“不用BroadcastReceiver,纯使用service来达到实时监听系统网络状态”,笔者查了半天的CSDN、博客园……结果千篇一律使用BroadcastReceiver来达到实时监听系统网络状态,没有纯使用service来监听网络状态,于是便有了本篇博文。
原创作品,转载请声明!
2 效果演示
有网络的时候,正常显示
无网络的时候,显示textView,提示没网络
3 功能分析
由于题目不允许直接使用BoardcastReceiver去获取信息,所以我们只能使用服务Service去不停获取网络状态,大致思路如下:
- 创建一个NetStatusService服务
- 定义一个回调接口Callback,声明回调事件onNetworkChange
- 在服务中的onCreate方法中创建一个线程,循环获取网络状态,判断网路是否连接,同时调用callback的onNetworkChange,触发回调事件
- 定义一个内部类MyBinder、实现getService()方法,同时在回调函数onBind()中创建该内部类MyBinder
- 在活动类中,创建ServiceConnection对象,在onServiceConnected方法中,获取服务Service同时实现Callback接口,在onNetworkChange方法中,获取与Service通信的网络状态信息,并根据信息从而判断是否显示“未连接”的TextView,显示给用户。
- 在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 源代码
后续上传……