Android仿QQ微信实时监测网络状态

先简单说一下思路:网络变化时系统会发出广播。所以我们监听这个广播,利用接口回调通知activity做相应的操作就好了。

思路

  • 判断网络状态(写个工具类NetUtil)
  • 写个类继承BroadcastReceiver(不要忘记在清单文件中注册)
  • 需要在清单文件中添加权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">
</uses-permission>
  • 回调接口(NetEvevt)
  • BaseActivity实现这个接口

直接上代码

NetUtil

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo; 

/**
 * Author: lenovo
 * Date: 2018/2/26
 * email: 1271396448@qq.com
 */ 

public class NetUtil { 

 /**
  * 没有连接网络
  */
 public static final int NETWORK_NONE = -1;
 /**
  * 移动网络
  */
 public static final int NETWORK_MOBILE = 0;
 /**
  * 无线网络
  */
 public static final int NETWORK_WIFI = 1; 

 public static int getNetWorkState(Context context) { 

  // 得到连接管理器对象
  ConnectivityManager connectivityManager = (ConnectivityManager) context
    .getSystemService(Context.CONNECTIVITY_SERVICE); 

  NetworkInfo activeNetworkInfo = connectivityManager
    .getActiveNetworkInfo();
  if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
   if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_WIFI)) {
    return NETWORK_WIFI;
   } else if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_MOBILE)) {
    return NETWORK_MOBILE;
   }
  } else {
   return NETWORK_NONE;
  }
  return NETWORK_NONE;
 } 

} 

NetBroadReceiver

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager; 

/**
 * Author: lenovo
 * Date: 2018/2/26
 * email: 1271396448@qq.com
 */ 

public class NetBroadcastReceiver extends BroadcastReceiver {
 public NetEvevt evevt = BaseActivity.evevt; 

 @Override
 public void onReceive(Context context, Intent intent) {
  // TODO Auto-generated method stub
  // 如果相等的话就说明网络状态发生了变化
  if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
   int netWorkState = NetUtil.getNetWorkState(context);
   // 接口回调传过去状态的类型
   evevt.onNetChange(netWorkState);
  }
 } 

 // 自定义接口
 public interface NetEvevt {
  public void onNetChange(int netMobile);
 }
}

BaseActivity

import android.os.Bundle;
import android.support.v4.app.FragmentActivity; 

/**
 * Author: lenovo
 * Date: 2018/2/26
 * email: 1271396448@qq.com
 */ 

abstract public class BaseActivity extends FragmentActivity implements NetBroadcastReceiver.NetEvevt { 

 public static NetBroadcastReceiver.NetEvevt evevt;
 /**
  * 网络类型
  */
 private int netMobile; 

 @Override
 protected void onCreate(Bundle arg0) {
  // TODO Auto-generated method stub
  super.onCreate(arg0);
  evevt = this;
  inspectNet();
 } 

 /**
  * 初始化时判断有没有网络
  */ 

 public boolean inspectNet() {
  this.netMobile = NetUtil.getNetWorkState(BaseActivity.this);
  return isNetConnect(); 

  // if (netMobile == 1) {
  // System.out.println("inspectNet:连接wifi");
  // } else if (netMobile == 0) {
  // System.out.println("inspectNet:连接移动数据");
  // } else if (netMobile == -1) {
  // System.out.println("inspectNet:当前没有网络");
  //
  // }
 } 

 /**
  * 网络变化之后的类型
  */
 @Override
 public void onNetChange(int netMobile) {
  // TODO Auto-generated method stub
  this.netMobile = netMobile;
  isNetConnect(); 

 } 

 /**
  * 判断有无网络 。
  *
  * @return true 有网, false 没有网络.
  */
 public boolean isNetConnect() {
  if (netMobile == 1) {
   return true;
  } else if (netMobile == 0) {
   return true;
  } else if (netMobile == -1) {
   return false; 

  }
  return false;
 } 

} 

MainActivity

import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView; 

public class MainActivity extends BaseActivity { 

 private TextView textView,txtView;
 ListView listView; //声明一个ListView对象 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  textView= (TextView) findViewById(R.id.textView);
  txtView=(TextView)this.findViewById(R.id.txtView); 

  //启动时判断网络状态
  boolean netConnect = this.isNetConnect();
  if (netConnect){
   textView.setVisibility(View.GONE);
   txtView.setText("网络连接正常");
  }else {
   textView.setVisibility(View.VISIBLE);
   txtView.setText("网络连接异常");
  }
 } 

 @Override
 public void onNetChange(int netMobile) {
  super.onNetChange(netMobile);
  //网络状态变化时的操作
  if (netMobile==NetUtil.NETWORK_NONE){
   textView.setVisibility(View.VISIBLE);
   txtView.setText("网络连接异常");
  }else {
   textView.setVisibility(View.GONE);
   txtView.setText("网络连接正常");
  }
 } 

} 

记得在清单文件中注册

<receiver android:name="cn.broadcastreceiver.NetBroadcastReceiver" >
 <intent-filter>
  <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
 </intent-filter>
</receiver> 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android 广播监听网络状态详解及实例代码

    Android 广播监听网络状态 我们在做多线程下载的时候,或者是在加载h5界面的时候,常常会遇到网络状态不好或者断网的时候,在这或者当我们的应用程序启动没有退出的时候,我们就需要对网络状态监听加以判断. 这时候,我们一般情况下,两种方式进行处理. 第一: 开启服务. 第二:发送广播的形式. 建议采用方法二. 源代码如下: 广播: /** * 有网络的广播 */ BroadcastReceiver connectionReceiver = new BroadcastReceiver() { @O

  • Android使用观察者模式Observer实现网络状态监听

    在Android开发过程中,很多时候都会用到当前网络的状态判断以及网络状况发生变化的时候做出相应的反应,要想监听网络状态,用观察者模式再合适不过了,废话不多说,直接上代码. 观察者模式属于面向对象的23中设计模式之一,不了解的同学请自行Google 既然用观察者模式,自然离不开观察者模式里最重要的两个类Subject和Ovserver了 Subjcet接口: /** * Description: observer subject * author: Wang * date: 11/28/16 1

  • Android中利用NetworkInfo判断网络状态时出现空指针(NullPointerException)问题的解决方法

    在Android中,很多人会用如下的方法判断当前网络是否可用: /** * 获取当前网络状态(是否可用) */ public static boolean isNetworkAvailable() { boolean isAalable = false; ConnectivityManager connManager = (ConnectivityManager) BaseApplication.getApplication().getSystemService(Context.CONNECTI

  • Android 判断网络状态及开启网路

    Android 判断网络状态及开启网路 在使用Android连接网络的时候,并不是每次都能连接到网络,在这个时候,我们最好是在程序启动的时候对网络的状态进行一下判断,如果没有网络则进行即时提醒用户进行设置. 要判断网络状态,首先需要有相应的权限,下面为权限代码: 即允许访问网络状态: <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

  • Android判断网络状态的代码

    本文实例为大家分享了Android判断网络状态的具体代码,供大家参考,具体内容如下 一.权限 需要在AndroidManifest.xml 添加访问权限 <usespermissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> 二.判断连接状态 /**

  • Android检查网络状态工具类详解

    在Android中开发具有网络交互的应用时候,有时候我们需要检查网络状态才能确定是否去请求网络,就需要用到公共类 代码: package com.example.ldp.com.util; /** * Created by Administrator on 2017/4/7. */ import android.content.Context; import android.app.Activity; import android.app.AlertDialog; import android.

  • android 监听网络状态的变化及实战的示例代码

    平时我们在请求错误的情况下,通常会进行处理一下,一般来说,主要分为两方面的错误 没有网络的错误 在有网络的情况下,我们客户端的错误或者服务器端的错误 今天这篇博客主要阐述以下问题 怎样监听网络状态的变化,包括是否打开WiFi,否打开数据网络,当前连接的网络是否可用 网络没有打开情况下的处理,如弹出对话框,跳转到 打开 WiFi设置的界面等 非WiFi情况下是否加载图片,是否播放视频等 实现思路 在网络错误的情况下获取网络状态进行判断,这种方法是可行的,但你想过了没有,如果每次都要进行这样的判断,

  • Android 监听网络状态方法详解

    Android 监听网络状态方法详解 一.加入网络权限 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission Android:name="android.permission.ACCESS_NETWORK_STATE" /> 二.判断手机网络的几个方案 1)判断是否有网络连接 public boolean isMobileConnected(Context context) { if (context != nul

  • Android 判断网络状态实例详解

    Android 判断网络状态实例详解 实例代码 package com.example.android; import java.io.IOException; import java.net.HttpURLConnection; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.URL; import java.util.

  • Android BroadcastReceiver实现网络状态实时监听

    前言:最近公司项目重构,为了提高用户的体验,项目中要求添加当前网络状态的实时监听,以便在无网络状态时给用户友好的提醒并修改UI界面.本文将介绍使用四大组件之一的BroadcastReceiver实现全局的网络状态监听,使用动态方式注册. BroadcastReceiver的注册方式: (1)动态注册:即在代码中使用registerReceiver()方法进行注册,动态注册需要在onPause或onDestory方法中反注册,不然会出现泄露. (2)静态注册:在清单文件的application节点

随机推荐