fastLib库是一个Android平台通用库,能快速提高项目效率。库地址:fastlib库
有时候我们想要在模块间,线程间进行通信。比如某个Activity中的Fragment中的Fragment想与另一个Activity进行通信,传递信息。也许我们可以一层一层的引用,但是很明显这样不但麻烦并且逻辑变的混乱
这时我们可以借助“全局广播”这样一个工具来帮助我们简化这样的工作流程
想要使用Fastlib中的全局广播需要先初始化,这一步建议放到Application中
EventObserver.build(Context);对订阅者进行事件订阅
EventObserver.getInstance().subscribe(subscriber);
不需要订阅事件时应解注册
EventObserver.getInstance().unsubscribe(this);这个订阅者应声明一个订阅方法,使用@Event注解来标明订阅方法
@Event public void receiveMessage(MessageClass mb){ dosomething }
上两个步骤就可以开启一个事件的监听,等待事件的到来
在另外的模块或线程中如果想要发送一个事件只需要使用EventObserver.sendEvent(Object)的方法
EventObserver.getInstance().sendEvent(Object);而发送的事件类将会发送到对应的订阅者中
下面我写一个小例子来帮助大家更好理解
事件类
public class MessageBean{ private String mMessage; public MessageBean(String message) { mMessage = message; } public String getMessage() { return mMessage; } }
第一个Activity作为注册者,注册的事件类为MessageBean
public class MainActivity extends AppCompatActivity{ TextView mMessage; Button mStartSecondActivity; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventObserver.build(this); //初始化EventObserver,这一步应放到Application中,这里为了演示简单化就放这里了 EventObserver.getInstance().subscribe(this); //注册全局广播,注册者为MainActivity自身 initViews(); } private void initViews(){ mMessage= (TextView) findViewById(R.id.message); mStartSecondActivity= (Button) findViewById(R.id.bt); mStartSecondActivity.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ startActivity(new Intent(MainActivity.this,SecondActivity.class)); } }); } /** * 订阅方法。订阅对象为MessageBean类 * @param mb */ @Event public void receiveMessage(MessageBean mb){ mMessage.setText(mb.getMessage()); } @Override public void onDestroy(){ super.onDestroy(); EventObserver.getInstance().unsubscribe(this); //在actiivty关闭时解除注册 } }
第二个Activity作为广播发送者,发送MessageBean事件类
public class SecondActivity extends AppCompatActivity{ EditText mEdtMessage; Button mSendMessage; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); init(); } private void init(){ mEdtMessage= (EditText) findViewById(R.id.content); mSendMessage= (Button) findViewById(R.id.sendMessage); mSendMessage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EventObserver.getInstance().sendEvent(new MessageBean(mEdtMessage.getText().toString())); //发送广播,内容为id为content的编辑框中的内容 } }); } }
两个Activity的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="空闲"/> <Button android:id="@+id/bt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="启动第二个activity"/> </LinearLayout>---分割线---
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/content" android:layout_width="match_parent" android:layout_height="wrap_content"/> <Button android:id="@+id/sendMessage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="发送"/> </LinearLayout>
注:切记在不使用时解除注册,否则可能造成内存泄漏
如有其它问题请在下方评论,我仅可能及时回复