簡體   English   中英

如何將上下文轉換為從 Fragment 注冊的 BroadcastReceiver 的 onReceive 中的偵聽器?

[英]How to cast context into listener in BroadcastReceiver's onReceive which is registering from Fragment?

這是 BroadcastReceiver ,其中上下文被轉換為偵聽器接口:

public class StatusChangeReceiver extends BroadcastReceiver {
    private IStatusChangeListener listener;

    @Override
    public void onReceive(Context context, Intent intent) {
        listener = (IStatusChangeListener) context; // getting error in this line when using LocalBroadcastManager

        if (NetworkUtil.isNetworkConnected()) {
            listener.onConnected();
        } else {
            listener.onDisconnected();
        }
    }
}

這是界面:

public interface IStatusChangeListener {
    void onConnected(String status);
    void onDisonnected(String status);
}

現在我在 Fragment 中實現IStatusChangeListener接口,如下所示:

public class MainFragment extends Fragment implements IStatusChangeListener {
    //some codes

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        StatusChangeReceiver r = new StatusChangeReceiver();
        LocalBroadcastManager.getInstance(getContext()).registerReceiver(r, new IntentFilter("connectionStatus"));
        //getContext().registerReceiver(r, new IntentFilter("connectionStatus"));
    }

    @Override
    void onConnected(String status) {
        //some log here
    }

    @Override
    void onDisonnected(String status) {
        //some log here
    }
}

當我使用getContext().registerReceiver(r, new IntentFilter("connectionStatus")); 然后我沒有收到任何錯誤,但我沒有在 Fragment 中實現的偵聽器方法中調用。

當我使用LocalBroadcastManager.getInstance(getContext()).registerReceiver(r, new IntentFilter("connectionStatus")); 然后我得到 java.lang.ClassCastException 錯誤:

<ContextName> cannot be cast to IStatusChangeListener

那么有什么辦法可以克服這個問題呢? 是否有任何標准方法來實現將上下文轉換為偵聽器的 BroadcastReceiver?

您必須檢查上下文是否是IStatusChangeListener的實例。

public class StatusChangeReceiver extends BroadcastReceiver {
    private IStatusChangeListener listener;

    @Override
    public void onReceive(Context context, Intent intent) {
        if(context instanceof IStatusChangeListener){
           
        listener = (IStatusChangeListener) context; // getting error in this line //when using LocalBroadcastManager

        if (NetworkUtil.isNetworkConnected()) {
            listener.onConnected();
        } else {
            listener.onDisconnected();
        }
        }
    }
}

在你的活動中

public class YourActivity extends AppCompatActivity implements IStatusChangeListener {

    MainFragment mainFragment;
    
    @Override
    public void onConnected(String status) {
        if (mainFragment!=null){
            mainFragment.onConnected();
        }
    }

    @Override
    public void onDisonnected(String status) {
        if (mainFragment!=null) {
            mainFragment.onDisonnected();
        }
    }

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        mainFragment = MainFragment();
        //do fragment trasaction
        //get transaction
       transaction.replace(R.id.fragment_container, mainFragment ); transaction.commit();

}
}

您可以嘗試以下方法,

public class SomeClass implements IStatusChangeListener,Parcelable {
  // implement the required methods
}

活動 class

SomeClass someclass = new SomeClass();

intent.putExtra("someclass",someclass)

接收器 Class

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundel b = intent..getExtras()

        if(b != null){
         SomeClass someclass = b.getParcelable("someclass");

        //rest of your logic
       }
    }

編輯:

只需將SomeClass的實例放在您將使用PendingIntent包裝的意圖中,您就可以使用該intent ,並且邏輯的 rest 保持不變,通過這種方式您的MainActivity不需要實現IStatusChangeListener

在尋找了幾個小時來尋找合適的方法來解決這個問題之后,我終於找到了一種方法。

通過這種方式,一個setListener()方法被暴露出來,以便FragmentActivity可以通過發送IStatusChangeListener的實例來設置監聽器。

public class StatusChangeReceiver extends BroadcastReceiver {
    private IStatusChangeListener listener;

    public void setListener(IStatusChangeListener listener) {
        this.listener = listener;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        if (NetworkUtil.isNetworkConnected()) {
            listener.onConnected();
        } else {
            listener.onDisconnected();
        }
    }
}

這是界面:

public interface IStatusChangeListener {
    void onConnected(String status);
    void onDisonnected(String status);
}

現在,需要有一個IStatusChangeListener接口的實例,而不是實現IStatusChangeListener接口。 然后,將此IStatusChangeListener實例傳遞給setListener()方法。

public class MainFragment extends Fragment { //Not implementing the interface

    private IStatusChangeListener listener = new IStatusChangeListener() {
        @Override
        void onConnected(String status) {
            //some log here
        }

        @Override
        void onDisonnected(String status) {
            //some log here
        }
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        StatusChangeReceiver r = new StatusChangeReceiver();
        r.setListener(listener); // pass the IStatusChangeListener instance
        LocalBroadcastManager.getInstance(getContext()).registerReceiver(r, new IntentFilter("connectionStatus"));
    }
}

注意:如果您從Fragment注冊BroadcastReceiver ,請始終使用LocalBroadcastManager

暫無
暫無

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

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