Android用ConnectivityManager实现网络监听
16lz
2021-01-23
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;@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" />
更多相关文章
- Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关
- Android 网络管理
- 使用Android网络编程实现简易聊天室
- Android编程获取网络连接状态及调用网络配置界面
- Android沉浸式(设置状态栏颜色)
- Android实时获得机器network的状态
- Android 页面或文件或网络请求时的加载动画
- Android 无线连接及连接状态研究
- android 实现沉浸式,状态栏