Android 网络状态实时检测
原文(参考学习):https://blog.csdn.net/mxiaoyem/article/details/50708052
在网络上看到了该文章,讲的是如何实时监测网络状态, 本人菜鸟一枚,学习该文章,照着代码敲. 感谢该博主的无私分享。
1. 在AndroidManifest.xml中添加权限
2. 新建工具类
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)) { return NETWORK_WIFI; } else if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_MOBILE)) { return NETWORK_MOBILE; } } else { return NETWORK_NONE; } return NETWORK_NONE; }}
4. 建立接收器
public class NetBroadcastReceiver extends BroadcastReceiver { public NetEvent event= BaseActivity.event; @Override public void onReceive(Context context, Intent intent) { // 如果相等的话就说明网络状态发生了变化 if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { int netWorkState = NetUtil.getNetWorkState(context); // 接口回调传过去状态的类型 event.onNetChange(netWorkState); } } //自定义网络切换接口 public interface NetEvent { public void onNetChange(int netMobile); }}
由于我自己的测试机子是Android 8.0, 我在接下来的BaseActivity中,采取动态注册,看了原博主的文章,Android 7.0(含)以上需要动态注册,如果是低于这个版本,需要在AndroidManifest.xml添加如下代码, 我的设备是Android 8.0, 就没有添加了。
4. 定义抽象基类BaseActivity当中,进行实现
public abstract class BaseActivity extends AppCompatActivity implements NetBroadcastReceiver.NetEvent
在BaseActivity当中,定义
public NetBroadcastReceiver netBroadcastReceiver; public static NetBroadcastReceiver.NetEvent event; private int netMobile;
在onCreate当中,进行接收器动态注册:
event= this; //实例化IntentFilter对象 IntentFilter filter = new IntentFilter(); filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); netBroadcastReceiver = new NetBroadcastReceiver(); registerReceiver(netBroadcastReceiver, filter);
在onDestroy当中释放
unregisterReceiver(netBroadcastReceiver);
添加处理方法
public boolean inspectNet() { this.netMobile = NetUtil.getNetWorkState(BaseActivity.this); return 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; }
5. 由于BaseActivity是一个抽象类,虽然实现了NetBroadcastReceiver.NetEvent, 但是并无实现方法。 由BaseActivity的子类实现。比如InitActivity继承BaseActivity,
public class InitActivity extends BaseActivity
由InitActivity中实现onNetChange方法, 当在InitActivity对应布局时,网络变化时,会自动触发该事件,我定义了一个变量特地用来存储网络状态, 用于之后的逻辑判断使用.
@Override public void onNetChange(int netMobile) { MyApplication.NET_STATUS= netMobile; }
此时可能会发现, 这样做的话,需要在每一个BaseActivity的子类都要实现这个方法,会比较繁琐。那么BaseActivity就不能写成抽象类, 直接在BaseActivity实现就可以了。以后会注意。
特此记录下使用, 方便以后使用。
更多相关文章
- 子线程更新UI的方法
- Android真机测试 INSTALL_FAILED_INSUFFICIENT_STORAGE 解决方法
- Android 网络框架 android-async-http
- Android沉浸式状态栏的开发
- Android如何设置顶部状态栏颜色(主题)
- 安卓(android)建立项目时失败,出现Android Manifest.xml file missi
- Android——Listview不用notifydatasetchanged更新数据的方法
- Android中两种使用Animation的方法
- 详解Android aidl的使用方法