
正文
android监听网络,android监听网络连接
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Android 超简单实现网络状态的监听
我们做项目的时候,不可避免的要做网络状态的监听,一般我们都是抽取出一个工具类来实现,比如:
细致的你当然还会再写一个判断网络类型的方法,反手再来一个例:
然后就可以在相应的操作前进行判断网络的判断:
但是这样做也有些问题:
接下来就是本文的重点,如何通过 NetStatusBus 这个库来解决以上问题,让你的网络状态监听变得前所未有的简单粗暴。
到这里就已经结束了,你的所有网络操作已经都可以清晰优雅的在订阅方法中进行处理了,当然你也可以继续往下看。
订阅方法必须填写一个NetType参数,可以通过NetType的值来判断当前网络类型。
@NetSubscribe中 netType为可选值,可以设置订阅的类型,可选值类型如下:
NetType.AUTO
这是默认值,任何网络状态发生变化,该类型订阅者都会被回调。同时会传入NetType参数告知你当前的网络类型,示例如下:
只要当前是由 WIFI 改变引发的网络状态变化,该类型订阅者都会被回调。同时会传入NetType参数告知你当前的网络类型,示例如下:
只要当前是由移动网络改变引发的网络状态变化,该类型订阅者都会被回调。同时会传入NetType参数告知你当前的网络类型,示例如下:
NetType.NONE
只有当网络丢失时,该类型订阅者才会被回调。
有人会觉得,我用个库爽就行了管它的原理干什么?
你放心,我只是小小的描述一下实现方式。
原理简单来说,就是在全局初始化的时候就绑定对网络的变化监听。然后将进行注册的父类所有的订阅方法保存至集合中,这里涉及到一些方法的校验,最后在网络状态发生改变时利用 Java 反射机制遍历执行所有订阅方法。熟悉 EventBus 的小伙伴已经看出来了这里借鉴了一小部分 EventBus 的思想。
回到第一步,那么具体是如何绑定对网络状态变化的监听呢?
以前我们是通过注册广播来实现绑定网络变更的监听,在Android 7.0 以后,Google 基于性能和安全原因对广播进行了很多限制,比如监听网络变更的广播 android.net.conn.CONNECTIVITY_CHANGE 使用静态注册的方式则无法生效,而动态注册的方式虽然可以生效但毕竟不是最优解。
同样出于性能和安全,以及拥抱变化的角度,最终我们还是使用官方推荐的方式,利用 ConnectivityManager.NetworkCallback 来进行网络变化的监听,这是在Android 5.0即android api 21推出的API,目前Android 5.0以上的市场占有率在 85%以上,随着国内各大厂商正在积极的推进适配普及Android Q,这个比例还会进一步增大,所以个人人认为无需过于担心低版本适配。
使用的时候出现这个问题是由于少添加了权限。
Caused by: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.
java.lang.RuntimeException: Unable to create application com.jiyun.wanandroid.WanApplication: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.
加上这几个权限就好了:
附上原文地址:
相关问答
Q1: android开发怎么监听网络请求
Android中网络情况时有变化,比如从有网到没网,从wifi到gprs,gprs又从cmwap到cmnet...等等!
如果你的程序有些功能是需要网络支持的,有时候就需要监听到网络的变化情况进行相应的处理。
比如说下载一个文件,如果突然断网了,怎么处理?网络又恢复了,如何监听到并重连?
当网络变化的时候系统会发出义个广播broadcast,只要在程序中注册一个广播接收器BroadcastReceiver,并在IntentFilter中添加相应的过滤,这样一旦网络有变化,程序就能监听到
public static final String CONNECTIVITY_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
private void registerDateTransReceiver() {
Log.i(TAG, "register receiver " + CONNECTIVITY_CHANGE_ACTION);
IntentFilter filter = new IntentFilter();
filter.addAction(CONNECTIVITY_CHANGE_ACTION);
filter.setPriority(1000);
registerReceiver(new MyReceiver(), filter);
}
在MyReceiver中:
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.i(TAG, "PfDataTransReceiver receive action " + action);
if(TextUtils.equals(action, CONNECTIVITY_CHANGE_ACTION)){//网络变化的时候会发送通知
Log.i(TAG, "网络变化了");
return;
}
}
当网络变化时,从有网到没网也会发广播,就举的例子来说,如果下载时断网了,接收到广播的时候要判断当前网络是可用还是不可用状态,如果可用进行什么操作;不可用进行什么操作:
public static NetworkInfo getActiveNetwork(Context context){
if (context == null)
return null;
ConnectivityManager mConnMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (mConnMgr == null)
return null;
NetworkInfo aActiveInfo = mConnMgr.getActiveNetworkInfo(); // 获取活动网络连接信息
return aActiveInfo;
}
这个方法返回的aActiveInfo可以判断网络的有无,如果返回的是null,这时候是断网了,如果返回对象不为空,则是连上了网。在返回的NetworkInfo对象里,可以有对象的方法获取更多的当前网络信息,比如是wifi还是cmwap等,就不多说了。
Q2: Android监听网络状态框架
就这么简单,让我们开始吧。
看下最终实现的使用:
日志:
好了,新建一个AndroidLibray开始实现。
权限走一波:
首先,咱们需要一个监听网络状态的工具类
在lib中创建一个广播,然后再配置文件里注册一下。
完善下咱们的receiver:
监听接口:
manager:
再加上一个枚举类:
OK,一套正常操作,一个最普通网络监听类写完了。接着咱们尝试用注解,让这个小框架看的有档次些。
完善一下自定义注解:
然后来捋一下思路:
照样是固定三部曲,按照步骤来:
1.先完善我们的注册方法
在这里,我创建了一个方法封装类。比较简单: MethodManager
这里的 mMethodList 是方法封装类(MethodManager)的List,用来存储筛选后的MainActivity中方法,也就是网络监听方法。以下是方法的筛选:
咱们定义一个post方法,去完成这项工作:
这里实现了通过网络监听注解上方的参数,我们可以单独监听某一种网络状态的变化。比如
上方参数表明,只有在WIFI断开和连接的时候,方法才会做出响应。想要所有提示设置为AUTO就行啦。
OK,做完逻辑以后执行一下:
大功告成!跑一下看看效果!
项目地址:
是一个练手的小项目,实际网络请求在7.0时就能通过一个CallBack轻松搞定了。
Q3: android中如何监听到其他应用的网络请求数据
目前android提供的工具没事,我们写工程都是自己写http请求,每次请求的时候打Log,记录请求的url和参数。请求回来了,打log,记录回来的数据,记录数据的状态,数据的内容。 目前只能这样。如果用模拟器的话,可以用vnStat或者CommView之类的监控电脑网卡的请求,间接的监控手机。一般开发用手机测试,这样就不行了。只能打log了
Q4: Android使用广播监听网络状态变化 一直收到系统广播
因为这个系统广播在不停的发送,系统网络状态在不停的变化。比如关闭,打开,扫描,正在连接,已连接等状态。
Q5: android中如何用广播监听网络变化,将其显示在通知栏上
网络状态发生变化的时候,系统会发出 android.net.conn.CONNECTIVITY_CHANGE .
下面是实现的 demo :
package mark.zhang;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.IBinder;
import android.util.Log;
public class ListenNetStateService extends Service {
private ConnectivityManager connectivityManager;
private NetworkInfo info;
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
Log.d("mark", "网络状态已经改变");
connectivityManager = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
info = connectivityManager.getActiveNetworkInfo();
if(info != null info.isAvailable()) {
String name = info.getTypeName();
Log.d("mark", "当前网络名称:" + name);
} else {
Log.d("mark", "没有可用网络");
}
}
}
};
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
IntentFilter mFilter = new IntentFilter();
mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mReceiver, mFilter);
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
}






