簡體   English   中英

用於互聯網連接的 Android BroadcastReceiver 調用兩次

[英]Android BroadcastReceiver for internet connection called twice

我遇到了這個問題一段時間,並注意到其他一些人也遇到了這個問題,但我無法解決它。

問題

我有一個 BroadcastReceiver,它一直在監聽互聯網的變化。 因此,無論何時連接或斷開互聯網,我都會在接收器的onReceive中獲得狀態。

問題是它總是被調用兩次。 當我連接調試器並在代碼中設置斷點時,我可以看到它被調用了兩次,但我的狀態更改代碼會執行。 當調試器未連接時,在這種情況下,我的狀態更改代碼根本不會執行。

我的代碼

廣播接收器文件

public class ConnectivityReceiver
    extends BroadcastReceiver {

public static ConnectivityReceiverListener connectivityReceiverListener;

public ConnectivityReceiver() {
    super();
}

@Override
public void onReceive(Context context, Intent arg1) {
    ConnectivityManager cm = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    boolean isConnected = activeNetwork != null
            && activeNetwork.isConnectedOrConnecting();

    if (connectivityReceiverListener != null) {
        connectivityReceiverListener.onNetworkConnectionChanged(isConnected);
    }
}

public static boolean isConnected() {
    ConnectivityManager
            cm = (ConnectivityManager) MyApplication.getInstance().getApplicationContext()
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    return activeNetwork != null
            && activeNetwork.isConnectedOrConnecting();
}


public interface ConnectivityReceiverListener {
    void onNetworkConnectionChanged(boolean isConnected);
}

}

清單意圖操作

<receiver
        android:name=".utils.ConnectivityReceiver"
        android:enabled="true">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
        </intent-filter>
    </receiver>

在這里,當我在過濾器中僅嘗試<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />時,它也來到onRecieve兩次。 當我嘗試使用<action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> ,我根本沒有來onReceive

基本活動

 @Override
public void onNetworkConnectionChanged(boolean isConnected) {
    setNetworkIndicator(isConnected); //THE CODE TO EXECUTE ON STATUS CHANGE
}

我嘗試了現有的答案,但對我不起作用。

我的猜測是 wifi 接收器被調用兩次,因為它被調用一次用於啟用狀態,一次用於后續啟用狀態。

文檔中指出:

指示 Wi-Fi 已啟用、禁用、啟用、禁用或未知的廣播意圖操作。 一個額外的提供這個狀態作為一個int。 如果可用,另一個額外的提供以前的狀態。

您可以檢查EXTRA_WIFI_STATEEXTRA_PREVIOUS_WIFI_STATE的值來驗證是否是這種情況。

因此,為了忽略不需要的連接/斷開連接狀態,您可以將onReceive()更新為以下內容:

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

    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

    boolean isConnected = false;
    if (activeNetwork != null){

        if (activeNetwork.getState() == NetworkInfo.State.CONNECTING || activeNetwork.getState() == NetworkInfo.State.DISCONNECTING){
            return;
        }
        isConnected = activeNetwork.isConnected();
    }

    if (connectivityReceiverListener != null) {
        connectivityReceiverListener.onNetworkConnectionChanged(isConnected);
    }

}

檢查此鏈接

對於Android 7及更高版本,您需要在您的活動文件中而不是在清單文件中注冊您的接收器。

因此,在您的活動的onCreate() 中添加以下幾行:

    myConnectivityReceiver = new ConnectivityReceiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction(getResources().getString(R.string.action_connectivity_change));
    registerReceiver(myConnectivityReceiver,filter);

並在onDestroy()

  @Override
  protected void onDestroy() {
      unregisterReceiver(myConnectivityReceiver);
      super.onDestroy();
  }

在 strings.xml 中定義意圖操作

<string name="action_connectivity_change">android.net.conn.CONNECTIVITY_CHANGE</string>

通常,當接收被調用兩次廣播接收器被調用兩次。所以請檢查您是否在 2 個位置注冊廣播? 如果是,那么請在簡歷或創建中注冊您的廣播,並在活動的onPause()方法中取消注冊

例如注冊廣播接收器,

LocalBroadcastManager.getInstance(this).registerReceiver(myLocalBroadcastManager, new IntentFilter(Constant.CONNECTIVITY_CHANGE));

未注冊的廣播接收器,如:-

LocalBroadcastManager.getInstance(this).unregisterReceiver(myLocalBroadcastManager);

我希望它能幫助你。

您應該檢查 onReceive 回調中的意圖操作:

String action = arg1.getAction();
if (action != null && action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
    // do your task here.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM