ネットワークリスニングによるマルチキャストの問題の解決

1977 ワード

時には、微信や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;
	    }
	 }
  }
}