重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

android监听网络,android监听网络包

android中如何用广播监听网络变化,将其显示在通知栏上

网络状态发生变化的时候,系统会发出 android.net.conn.CONNECTIVITY_CHANGE .

创新互联专注于中大型企业的做网站、成都网站制作和网站改版、网站营销服务,追求商业策划与数据分析、创意艺术与技术开发的融合,累计客户数千家,服务满意度达97%。帮助广大客户顺利对接上互联网浪潮,准确优选出符合自己需要的互联网运用,我们将一直专注品牌网站制作和互联网程序开发,在前进的路上,与客户一起成长!

下面是实现的 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);

}

}

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.

加上这几个权限就好了:

附上原文地址:

android系统广播应用关闭时监听

必须实时监控这个程序的实时网络状态,android在网络断开与连接的时候都会发出广播,我们通过接收系统的广播就可以实现网络的监听.

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等,就不多说了。

android中如何监听到其他应用的网络请求数据

目前android提供的工具没事,我们写工程都是自己写http请求,每次请求的时候打Log,记录请求的url和参数。请求回来了,打log,记录回来的数据,记录数据的状态,数据的内容。 目前只能这样。如果用模拟器的话,可以用vnStat或者CommView之类的监控电脑网卡的请求,间接的监控手机。一般开发用手机测试,这样就不行了。只能打log了


网页标题:android监听网络,android监听网络包
URL分享:http://cqcxhl.cn/article/hojhde.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP