2014-11-25 113 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