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;@Overridepublic 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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);}//进入登录页面就检查@Overridepublic void onResume() {super.onStart();if (netBroadcastReceiver == null) {//实例化网络接收器netBroadcastReceiver = new NetBroadcastReceiver();//实例化意图IntentFilter filter = new IntentFilter();//设置广播的类型filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);//注册广播,有网络变化的时候会触发onReceiveregisterReceiver(netBroadcastReceiver, filter);// 设置监听netBroadcastReceiver.setNetEvent(this);}}//网络状态变化后,回调此方法,前端页面做出相应改变@Overridepublic void onNetChange(int netMobile) {// TODO Auto-generated method stubthis.netMobile = netMobile;isNetConnect();}private void isNetConnect() {switch (netMobile) {case 1:// wifinet.setVisibility(View.GONE);break;case 0:// 移动数据net.setVisibility(View.GONE);break;case -1:// 没有网络net.setVisibility(View.VISIBLE);break;}}//在页面销毁的时候,取消注册的广播@Overridepublic void onPause() {super.onDestroy();if (netBroadcastReceiver != null) {unregisterReceiver(netBroadcastReceiver);}}}

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

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

更多相关文章

  1. Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关
  2. Android 网络管理
  3. 使用Android网络编程实现简易聊天室
  4. Android编程获取网络连接状态及调用网络配置界面
  5. Android沉浸式(设置状态栏颜色)
  6. Android实时获得机器network的状态
  7. Android 页面或文件或网络请求时的加载动画
  8. Android 无线连接及连接状态研究
  9. android 实现沉浸式,状态栏

随机推荐

  1. 《Qt on Android核心编程》勘误
  2. Android自用-----系统自带app与用户app
  3. android 调用android系统的对话框控件
  4. android读取扫码模组数据
  5. Android(安卓)特色开发,基于位置的服务
  6. Android 音频处理专题(播放音乐,音频捕获,
  7. Android(安卓)的属性动画的实现和使用详
  8. Android平台介绍
  9. 【Android通过手势实现的缩放处理】
  10. Android(安卓)---Application 开发中共享