我为我的应用程序实现了一个总线,用于片段和活动之间的通信。我通过向列表添加Fragment
或Activity
的实例来添加订阅者。然后我遍历该列表,调用一个方法来通知每个订阅者正在发生的事情。现在我需要保持列表清洁,我不想在列表中添加同一类的多个实例。我可以使用equals()
作为Activity
,但我不能使用Fragment
因为它的最终版本所以我无法覆盖它。
我做了什么
我试图在列表中保留每个订阅者的Class
对象,直到我调用该方法为止。你无法调用没有实例的方法来调用它。所以这不起作用。
我还可以保留一个单独的列表,一个用于保存Class
个对象,另一个用于保存实际的实例。但是我想尽可能避免添加另一个依赖。
我还可以手动对每个instanceof
进行Fragment
检查,但我不想这样做,因为我已经有5个片段,如果我添加或删除任何,我必须回来在这里并更新此方法。
所以我的问题是,除了添加另一个List
来保存Class
对象或手动instanceof
检查之外,还有其他任何方法可以确保我不添加多个实例订阅者List
?
如果您需要,以下是相关代码:
public void subscribe(Object object) {
if (!mSubscribers.contains(object)) {
mSubscribers.add(object);
}
}
public void notifySubscribers(BusEvent event) throws InvocationTargetException, IllegalAccessException {
for (Object o : mSubscribers) {
Method methodToCall = getMethodToCall(o);
if (methodToCall != null) {
methodToCall.invoke(o, event);
}
}
}
答案 0 :(得分:0)
好的,我找到了适合我的问题的答案。我想在这里分享一下,希望能帮助其他人。 Android有一个名为LocalBroadcastManager
的类。它在v4支持库中提供。在您的活动中,您调用'LocalBroadcastManager.getInstance()。registerReceiver()'。你将一个扩展BroadcastReceiver
的类和一个'IntentFilter'告诉接收者要监听的内容。然后在包括Fragment
的任何课程中,您拨打LocalBroadcastManager.getInstance().sendBroadcast()
并传入与您在注册时使用的Intent
相匹配的IntentFilter
。以下是我用来使其工作的代码:
private void registerLocalBroadcastReceiver() {
// call this method in your activity (or any class you want to listen for broadcasts)
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);
manager.registerReceiver(new OpenMenuBroadcastReceiver(), new IntentFilter("open-html"));
}
private void sendMessageToActivity(int position) {
// use this in a fragment (or any other class) to send a message
LocalBroadcastManager broadcast = LocalBroadcastManager.getInstance(getActivity());
Intent message = new Intent("open-html");
String name = (String) getListAdapter().getItem(position);
message.putExtra("name", name);
broadcast.sendBroadcast(message);
}
class OpenMenuBroadcastReceiver extends BroadcastReceiver {
// this is an inner class to my activity, when you send the message this method
// will be called to handle the message
@Override
public void onReceive(Context context, Intent intent) {
String name = intent.getStringExtra("name");
if (name != null && name.equalsIgnoreCase("home")) {
replaceFragment(Tag.HOME_FRAGMENT.getTag(), new HomeFragment(), R.id.main_frame);
mDrawerLayout.closeDrawer(Gravity.START);
return;
}
openMenuItemsFragment(name);
}
}
关于这一点的好处是它完全属于您的应用本地。外部应用程序无法接收您的广播,因此其安全性。您可以在Android developer网站上找到有关如何使用它的更多信息。