解决网络监听多次发送广播的问题

有时候我们需要写一个程序来监听网络的变化,以实现即时刷新的问题,比如微信或者QQ都有自动重连的功能。单纯的用广播接收和ConnectivityManager难以实现,因为每次我们切换g网和wifi或者启用一个网络,系统都会发送多次网络变化的广播,如果我们把业务逻辑放在广播接收器里面处理,就会不必要的调用多次。比如当我们启动wifi时,系统将发送多次广播,当我们判断是否有网络连接的时候,会多次判断有网络(如果刚刚启动数据流量或者wifi)。这样里面的代码就会重复执行。想了各种办法,最终想到的解决方案如下。就是设置一个标记变量,稍微看一下就明白了:

package com.example.mywork;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class InternetState
{
	private boolean update = false;
  private Date lastConnTime;
  OnInternetListener  internetListener;
  Context context;
  protected void setInternetListener(OnInternetListener listener,Context context)
  {

	  internetListener = listener;
	  if(internetListener==null||context==null)
		  return ;
	  IntentFilter filter = new IntentFilter();
	  filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
	  context.registerReceiver(new NetState(), filter);
  }
  private class NetState extends BroadcastReceiver
  {

	@Override
	public void onReceive(Context context, Intent intent)
	{
	   ConnectivityManager connManager =  (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
	   NetworkInfo gprs = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
	   NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
	   NetworkInfo info = connManager.getActiveNetworkInfo();
	    if(!update&&(wifi.isConnected()||gprs.isConnected()))//有网但是还没刷新
	    {
	    	update = true;
	    	System.out.println("111111111111111");
	    }
	    else if(!wifi.isConnected()&&!gprs.isConnected())//没网
	    {
	    	update = false;
	    }
	 }
  }
}
时间: 2024-10-25 16:55:19

解决网络监听多次发送广播的问题的相关文章

高大上的“网络监听”,其实你也能做!

出来工作一年了,回忆大学那时,我所在专业里有一位大神级人物,他每天都和我们聊一下很“美丽”的事物.他最经常喜欢所得一句话,“一切事物都可以用01表示出来”.那时的他,很喜欢分享,很喜欢去研究一些高大上的问题,数学是他的强项.那时,我们桂林高校的五子棋大赛,他拿了冠军,证明了自己,并不是一个只会说不会做的人.其实我对他还是很有好感的,不过由于各种原因吧,我们交往并不算太深.还记得的那些夜晚,学习和生活上遇到很多困惑,经常很他一起聊到11点半,讨论各种奇怪的事情.从那开始,我就渐渐地更喜欢写程序啦.

转:网络监听原理

网络监听是指利用计算机的网络接口截获目的地为第三方计算机的数据报文的一种技术.利用这种技术可以监听网络的当前流量状况:网络程序的运行以及非法窃取网络中传输的机密信息. 在共享式以太网中,所有的通讯都是广播的,也就是说通常在同一网段的所有网络接口都可以访问在物理媒体上传输的所有数据,使用ARP和RARP协议进行相互转换.在正常的情况下,一个网络接口应该只响应两种数据帧:与自己硬件地址相匹配的数据帧和发向所有机器的广播数据帧.在一个实际的系统中,数据的收发由网卡来完成.每个以太网卡拥有一个全球难一的

网络监听原理(局域网数据窃听)

在网络中,当信息进行传播的时候,可以利用工具,将网络接口设置在监听的模式,便可将网络中正在传播的信息截获或者捕获到,从而进行攻击.网络监听在网络中的任何一个位置模式下都可实施进行.而黑客一般都是利用网络监听来截取用户口令.比如当有人占领了一台主机之后,那么他要再想将战果扩大到这个主机所在的整个局域网话,监听往往是他们选择的捷径.很多时候我在各类安全论坛上看到一些初学的爱好者,在他们认为如果占领了某主机之后那么想进入它的内部网应该是很简单的.其实非也,进入了某主机再想转入它的内部网络里的其它机器也

为什么监听不到开机广播action.BOOT_COMPLETED

为什么监听不到开机广播action.BOOT_COMPLETED 1. 说明 Android手机开机后,会发送android.intent.action.BOOT_COMPLETED广播,监听这个广播就能监听开机. 2. 代码  注册广播   <receiver android:name="com.javen.broadcast.BootBroadCastReceiver" > <intent-filter> <action android:name=&q

android监听屏幕打开关闭广播无响应的情况

android在屏幕打开和关闭的时候会发出广播,但是如果receiver配置在AndroidManifest.xml中时,receiver是接受不到任何广播的. <receiver android:name="cn.abcd.listener.ScreenStateReceiver" > <intent-filter> <action android:name="android.intent.action.SCREEN_OFF" /&g

IOS开发—网络监听

网络监听用到的类为Reachability.h,这个Xcode项目里面是不自带的,需要从github上面下载,在使用的时候记着导入SystemConfiguration.framework. 首先是在AppDelegate.m中设置网络监听 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotifica

iOS:Reachability网络监听

iOS利用Reachability确认网络环境3G/WIFI 开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息.如果没有处理它们,是不会通过Apple的审查的. Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法.在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中.如下图: 我们来看看Reachability.h文件中的具体内容: #import <Found

iOS手机信号网络监听

//设置网络监听 - (void)monitorNetworking { //监听网络状态 AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager]; //显然是枚举值 /* typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) { AFNetworkReachabilityStatusUnknown = -1,//未识别的网络

java实现网络监听

Java实现网络监听 import java.net.*; import java.io.*; public class tcpServer { public static void main(String args[]) { int port; ServerSocket server_socket; BufferedReader input; try { port = Integer.parseInt(args[0]); } catch (Exception e) { System.out.p