我做的事件总线传递信息是通过实体类,为了好用,这个实体类必须用户来定义,所以泛型就用上场了,然后存储各个Activity的时候都是保存为Activity类型,事件总线的接收函数名也是固定的,所以使用反射能够统一处理。
首先创建一个专门为了实现事件总线的工具类并用单例模式
public static EventLine eventLine; private EventLine(){ } public static EventLine getInstance(){ if(eventLine == null){ synchronized (EventLine.class){ if(eventLine == null) eventLine = new EventLine(); } } return eventLine; }
然后我们需要保存各个Activity,顺便实现退出全部Activity
private ArrayList<Activity> activities = new ArrayList<Activity>(); public void addActivity(Activity activity){ activities.add(activity); } public void removeActivity(Activity activity){ activities.remove(activity); } public void finishAll(){ for(Activity activity : activities){ activity.finish(); } }现在能够在Activity里注册和注销了
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventLine.getInstance().addActivity(this); } @Override protected void onDestroy() { EventLine.getInstance().removeActivity(this); super.onDestroy(); }但是真正的功能还没实现,遍历保存的Activity,然后通过反射调用receive函数,并通过泛型把参数传输通过
public void postData(T ojb){ for(Activity activity : activities){ Class<? extends Activity> cls = activity.getClass(); try { Method declaredMethod = cls.getDeclaredMethod("receive", ojb.getClass()); declaredMethod.invoke(activity, (Object) ojb); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } }在Activity里添加接收函数
public void receive(DataBean dataBean){ Log.v("zzw","MainActivity 接收到了"+dataBean.data); }触发消息传递
DataBean dataBean = new DataBean(); dataBean.data = "来自ThreeActivity的消息"; EventLine.getInstance().postData(dataBean);效果良好
01-25 14:20:57.673 22209-22209/com.example.zth.eventline V/zzw: MainActivity 接收到了来自ThreeActivity的消息
01-25 14:20:57.673 22209-22209/com.example.zth.eventline V/zzw: TwoActivity 接收到了来自ThreeActivity的消息
完整的事件总线代码如下:
public class EventLine<T> { public static EventLine eventLine; private EventLine(){ } public static EventLine getInstance(){ if(eventLine == null){ synchronized (EventLine.class){ if(eventLine == null) eventLine = new EventLine(); } } return eventLine; } private ArrayList<Activity> activities = new ArrayList<Activity>(); public void addActivity(Activity activity){ activities.add(activity); } public void removeActivity(Activity activity){ activities.remove(activity); } public void finishAll(){ for(Activity activity : activities){ activity.finish(); } } public void postData(T ojb){ for(Activity activity : activities){ Class<? extends Activity> cls = activity.getClass(); try { Method declaredMethod = cls.getDeclaredMethod("receive", ojb.getClass()); declaredMethod.invoke(activity, (Object) ojb); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } } }
下一次就说如何实现Activity上主线程和子线程的通讯