Android用ConnectivityManager实现网络监听

Android的系统广播ConnectivityManager实现网络监听

实现效果

当网络不可用(GPRS断开,或连接的wifi网络不可用)时,页面上方给出提示框信息。
Android用ConnectivityManager实现网络监听_第1张图片

实现思路

使用系统广播ConnectivityManager.CONNECTIVITY_ACTION

  1. 自定义网络不可用时的图片和布局。
  2. 自定义网络状态的获取类NetUtil.java
  3. 自定义网络广播接收器NetBroadcastReceiver.java
  4. 在广播接受者中注册广播,并呈现网络的状态。
实现步骤

1.自定义网络不可用时的图片和布局。


<LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="3" >
        <LinearLayout
            android:id="@+id/net"
            android:layout_width="fill_parent"
            android:layout_height="40dp"
            android:layout_marginTop="0dp"
            android:background="@color/warnred"
            android:orientation="horizontal"
            android:visibility="gone" >
            <ImageView
                android:id="@+id/imageView1"
                android:layout_width="22dp"
                android:layout_height="22dp"
                android:layout_marginTop="9dp"
                android:layout_marginLeft="20dp"
                android:src="@drawable/warn" />
            <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="24dp"
                android:layout_marginTop="10dp"
            	android:layout_marginLeft="20dp"
                android:text="当前网络连接不可用!" />
        LinearLayout>
        
    LinearLayout>

2.自定义网络状态的获取类NetUtil.java

package com.assets.util;
import java.io.IOException;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
/*tag:获取并判断网络状态*/
public class NetUtil {

	private static final int NETWORK_NONE = -1;// 没有连网
	private static final int NETWORK_MOBILE = 0;// 移动网络
	private 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)) {
				Log.i("通知" , "当前网络处于WiFi状态");
				//是否可上网
				if (isNetworkOnline()){
					return NETWORK_WIFI;
				}else{
					return NETWORK_NONE;
				}
			} else if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_MOBILE)) {
				return NETWORK_MOBILE;
			}
		} else {
			return NETWORK_NONE;
		}
		return NETWORK_NONE;
	}
	
	//判断当前网络是否能连同外网
		public static boolean isNetworkOnline() {
		    Runtime runtime = Runtime.getRuntime();
		    try {
		        Process ipProcess = runtime.exec("ping -c 3 www.baidu.com");
		        int exitValue = ipProcess.waitFor();
		        Log.i("Avalible", "Process:"+exitValue);
		      //wifi不可用或未连接,返回2;WiFi需要认证,返回1;WiFi可用,返回0;
		        return (exitValue == 0);
		        
		    } catch (IOException | InterruptedException e) {
		        e.printStackTrace();
		    }
		    return false;
		}
}
  1. 自定义网络广播接收器NetBroadcastReceiver.java
public class NetBroadcastReceiver extends BroadcastReceiver {

	private NetEvent netEvent;

	@Override
	public void onReceive(Context context, Intent intent) {
		//onReceive这里写上相关的处理代码,一般来说,不要此添加过多的逻辑或者是进行任何的耗时操作
        //因为广播接收器中是不允许开启多线程的,过久的操作就会出现报错
        //广播接收器更多的是扮演一种打开程序其他组件的角色,比如创建一条状态栏通知,或者启动某个服务
		
		//判断广播的类型为网络action后
		if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {			
			//获取当前网络状态,并将结果发送给广播接受者
			int netWrokState = NetUtil.getNetWorkState(context);
			if (netEvent != null)
				netEvent.onNetChange(netWrokState);
		}
	}
	
	public void setNetEvent(NetEvent netEvent) {
		this.netEvent = netEvent;
	}

4.在广播接受者中注册广播,并呈现网络的状态。

public interface NetEvent {
	void onNetChange(int netMobile);
}

public class User_login extends Activity implements NetEvent {
	private EditText userId;
	private EditText userPw;
	private Button loginBtn;
	private LinearLayout net;
	private int netMobile;
	private NetBroadcastReceiver netBroadcastReceiver;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.user_login);

		userId = (EditText) findViewById(R.id.userId);
		userPw = (EditText) findViewById(R.id.userPw);
		loginBtn = (Button) findViewById(R.id.login_btn);
		net = (LinearLayout) findViewById(R.id.net);
	}

//	进入登录页面就检查
	@Override
	public void onResume() {
		super.onStart();
		if (netBroadcastReceiver == null) {
			//实例化网络接收器
			netBroadcastReceiver = new NetBroadcastReceiver();
			//实例化意图
			IntentFilter filter = new IntentFilter();
			//设置广播的类型
			filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
			//注册广播,有网络变化的时候会触发onReceive
			registerReceiver(netBroadcastReceiver, filter);
			// 设置监听
			netBroadcastReceiver.setNetEvent(this);
		}
	}
	//网络状态变化后,回调此方法,前端页面做出相应改变
	@Override
	public void onNetChange(int netMobile) {
		// TODO Auto-generated method stub
		this.netMobile = netMobile;
		isNetConnect();
	}

	private void isNetConnect() {
		switch (netMobile) {
		case 1:// wifi
			net.setVisibility(View.GONE);
			break;
		case 0:// 移动数据
			net.setVisibility(View.GONE);
			break;
		case -1:// 没有网络
			net.setVisibility(View.VISIBLE);
			break;
		}
	}

//	在页面销毁的时候,取消注册的广播
	@Override
	public void onPause() {
		super.onDestroy();
		if (netBroadcastReceiver != null) {
			unregisterReceiver(netBroadcastReceiver);
		}
	}
}

补充!
记得在AndroidManifest.xml添加访问网络状态的权限


<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

你可能感兴趣的:(Android)