![](/img/trans.png)
[英]What is the Context passed into onReceive() of a BroadcastReceiver?
[英]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()
方法被暴露出來,以便Fragment
或Activity
可以通過發送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.