2014-11-25 107 views
2

我有以下广播接收机。wifi连接改变广播接收机重复多次

public class TestNetworkReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     String TAG = "TEST:"; 

     if (intent.getAction().equals("android.net.wifi.WIFI_STATE_CHANGED")) { 

      Log.i(TAG, "Wifi toggled"); 

     } else if (intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE")) { 

      Log.i(TAG, "Network connection changed"); 

      ConnectivityManager cm = (ConnectivityManager) context 
        .getSystemService(Context.CONNECTIVITY_SERVICE); 

      NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 

      if (networkInfo != null && networkInfo.isConnected()) { 

       Log.i(TAG, "Network connecion is:" + networkInfo.getTypeName()); 

       Log.i(TAG, "Detail:"+networkInfo.isFailover()); 
      } 
     } 
    } 
} 

当我打开和关闭的WiFi

I/TEST:﹕ Wifi toggled 
I/TEST:﹕ Network connection changed 
I/TEST:﹕ Network connecion is:WIFI 
I/TEST:﹕ Detail:false 
I/TEST:﹕ Network connection changed 
I/TEST:﹕ Network connecion is:WIFI 
I/TEST:﹕ Detail:false 
I/TEST:﹕ Network connection changed 
I/TEST:﹕ Network connecion is:WIFI 
I/TEST:﹕ Detail:false 

I/TEST:﹕ Network connection changed 
I/TEST:﹕ Network connecion is:mobile 
I/TEST:﹕ Detail:true 
I/TEST:﹕ Network connection changed 
I/TEST:﹕ Network connecion is:mobile 
I/TEST:﹕ Detail:true 

我试图做到的,是要知道什么时候该连接出现“移动”或“WiFi”的,是活跃,但只有一次。否则它会运行我的例程3或4次。我试过改变networkInfo.whatever(),但是一切重复3或4或更多或更少的次数。有没有一种方法可以让我知道连接已经改变,而且它只是接收机某处的一次?

回答

1

你可以试试这个

public class TestNetworkReceiver extends BroadcastReceiver { 
    public static boolean firstTime = true; 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     String TAG = "TEST:"; 

     if (firstTime) { 
      firstTime = false; 
      //do stuff 
     } 
    } 
} 

可能不是最elegand方式,但它确实在招

+0

大声笑。这完全是我最终做的,你是对的,它根本不是优雅的。好东西,我不是在画一幅画! – 2015-07-23 15:22:21

+0

你能把它标记为正确答案吗?或者至少一些upvote :) – Dantalian 2015-07-23 18:35:51

3

广播[CONNECTIVITY_ACTION]在少数设备上似乎很粘,因此当您注册接收器时,它会立即使用最近发送的广播调用onReceive()。

因此,建议您需要对清单上的接收器进行静态声明。

这是我用:

@Override 
protected void onResume() { 
    super.onResume(); 
    setMyReceiverStayus(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    setMyReceiverStayus(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); 
} 


private void setMyReceiverStayus(int receiverState) { 
    ComponentName receiver = new ComponentName(this, MyReceiver.class); 
    PackageManager pm = this.getPackageManager(); 
    pm.setComponentEnabledSetting(receiver, receiverState,  
    PackageManager.DONT_KILL_APP); 
} 

AndroidManifest.xml中

<receiver android:name="com.example.receiver.MyReceiver"> 
    <intent-filter> 
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 
+0

对不起,可以请你澄清?我不确定我在这里得到了这个想法。我创建了ComponentName,而且Manifest与我已有的相同,但结果相同。 3x for wifi和2x for mobile,当我启用/禁用wifi时,它将来回切换。 – 2014-11-25 07:08:47

+0

基本上我的意思是把你的接收器声明改为静态的清单 – KOTIOS 2014-11-25 07:18:57

+0

对不起,在这种情况下静态意味着什么?如果你的意思是把接收器的全名,我已经做到了。 – 2014-11-25 18:39:21

0
public void onReceive(Context context, Intent intent) { 
    ConnectivityManager cm = (ConnectivityManager) 
    context.getSystemService(Context.CONNECTIVITY_SERVICE); 

     NetworkInfo info = cm.getActiveNetworkInfo(); 
     if (info != null) { 
      if (info.isConnected()) { 
       // you got a connection! tell your user! 
       Log.i("Post", "Connected"); 

      } 
     } 
    } 

将其添加到清单

<receiver android:name="packageName.ConnectivityDetector_Receiver" > 
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
     </intent-filter> 
    </receiver> 

试试这个

+0

是的,我得到了两个连接到mobil和三个来自wifi的答复。这就是问题。 – 2014-11-25 06:54:54

+0

什么你想要2从移动和2从WiFi – 2014-11-25 06:59:56

+0

使用我的接收器它将被称为onconnectivityChanged,但它包含检查。如果(info.isConnected()){ 把你的代码放在这里 } – 2014-11-25 07:02:42