Android的系统广播ConnectivityManager实现网络监听
实现效果
当网络不可用(GPRS断开,或连接的wifi网络不可用)时,页面上方给出提示框信息。
实现思路
使用系统广播ConnectivityManager.CONNECTIVITY_ACTION
- 自定义网络不可用时的图片和布局。
- 自定义网络状态的获取类
NetUtil.java
。- 自定义网络广播接收器
NetBroadcastReceiver.java
。- 在广播接受者中注册广播,并呈现网络的状态。
实现步骤
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;
}
}
- 自定义网络广播接收器
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" />