前言
最近項(xiàng)目中涉及需要在一個(gè)Activity中關(guān)閉另一個(gè)Activity或者在一個(gè)Activity中關(guān)閉多個(gè)Activity的需求瘩扼,不涉及到應(yīng)用的退出谆甜。自己首先想了一些方案,同時(shí)也查了一些方案集绰,就各個(gè)方案總結(jié)出比較合適的一種方案规辱。
EventBus是一款針對Android優(yōu)化的發(fā)布/訂閱事件總線。主要功能是替代Intent,Handler,BroadCast在Fragment倒慧,Activity按摘,Service,線程之間傳遞消息.優(yōu)點(diǎn)是開銷小纫谅,代碼更優(yōu)雅炫贤,以及將發(fā)送者和接收者解耦。
訂閱者付秕,發(fā)布者兰珍,訂閱事件,事件總線?
它們的關(guān)系可以用官方的圖表示:
訂閱者可以訂閱多個(gè)事件询吴,發(fā)送者可以發(fā)布任何事件掠河,發(fā)布者同時(shí)也可以是訂閱者。
官方給到四個(gè)步驟(EventBus in 4 steps):
(1)Define events://定義事件publicclassMessageEvent{ /* Additional fields if needed */ }(2)Prepare subscribers//注冊訂閱者Registeryour subscriber (inyour onCreateorinaconstructor):eventBus.register(this);(3)Declare your subscribingmethod://訂閱事件的動(dòng)作@Subscribepublicvoid onEvent(AnyEventTypeevent){/* Do something */};(4)Post events://發(fā)布者發(fā)送事件eventBus.post(event);
(1)Define events://定義事件public class MessageEvent { /* Additional fields if needed */ }(2)Prepare subscribers//注冊訂閱者Register your subscriber (in your onCreate or in a constructor):eventBus.register(this);
(3)Declare your subscribing method://訂閱事件的動(dòng)作@Subscribepublic void onEvent(AnyEventType event) {/* Do something */};
(4)Post events://發(fā)布者發(fā)送事件eventBus.post(event);
在項(xiàng)目中猛计,最主要用到的EventBus的方法有:
EventBus.getDefault().register(this);//訂閱事件EventBus.getDefault().post(object);//發(fā)布事件EventBus.getDefault().unregister(this);//取消訂閱onEvent:使用onEvent作為訂閱函數(shù)唠摹,那么該事件在哪個(gè)線程發(fā)布出來的,onEvent就會在這個(gè)線程中運(yùn)行奉瘤,也就是說發(fā)布事件和接收事件線程在同一個(gè)線程勾拉。onEventMainThread:無論事件在哪個(gè)線程發(fā)布出來的煮甥,始終在UI線程中執(zhí)行訂閱事件的操作。onEventBackground:無論事件在哪個(gè)線程發(fā)布出來的藕赞,始終在工作線程中執(zhí)行訂閱事件的操作成肘。onEventAsync:使用這個(gè)函數(shù)作為訂閱函數(shù),那么無論事件在哪個(gè)線程發(fā)布斧蜕,都會創(chuàng)建新的子線程在執(zhí)行onEventAsync.
首先在build.gradle中添加依賴:
compile 'org.greenrobot:eventbus:3.0.0'
主頁MainActivity代碼如下:
public classMainActivityextendsAppCompatActivity{ private TextView tv1,tv_status;
? ? @Override? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? EventBus.getDefault().register(this);//在當(dāng)前界面注冊一個(gè)訂閱者? ? ? ? tv1=(TextView)findViewById(R.id.tv);
? ? ? ? tv_status=(TextView)findViewById(R.id.tv_status);
? ? ? ? findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
? ? ? ? ? ? @Override? ? ? ? ? ? public void onClick(View view) {
? ? ? ? ? ? ? ? Intent intent = new Intent(getApplicationContext(),
? ? ? ? ? ? ? ? ? ? ? ? LoginActivity.class);
? ? ? ? ? ? ? ? startActivity(intent);
? ? ? ? ? ? }
? ? ? ? });
? ? }
? ? @Subscribe? ? ? ? ? //訂閱事件FirstEvent? ? public? void onEventMainThread(LoginSuccessdEvent event){
? ? ? ? String msg=event.getMsg();
? ? ? ? tv_status.setText("已登錄双霍,當(dāng)前賬號"+msg);//獲取事件中傳遞的參數(shù)? ? ? Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
? ? }
? ? @Override? ? protected void onDestroy() {
? ? ? ? super.onDestroy();
? ? ? ? EventBus.getDefault().unregister(this);//取消注冊? ? }
}
@Subscribe //訂閱事件FirstEvent public void onEventMainThread(LoginSuccessdEvent event){
? ? ? ? Log.i("TAG","LoginSuccessdEvent");
? ? ? ? LoginActivity.this.finish();//收到訂閱事件之后關(guān)閉當(dāng)前界面? ? ? ? Toast.makeText(this, "finish", Toast.LENGTH_LONG).show();
? ? }
在注冊界面RegistActivity:
//發(fā)布事件
EventBus.getDefault().post(newLoginSuccessdEvent(username));
定義一個(gè)登錄成功事件類LoginSuccessdEvent .java:
public class LoginSuccessdEvent {
? ? private String msg;
? ? public LoginSuccessdEvent(String msg) {//事件傳遞參數(shù)? ? ? ? this.msg = msg;
? ? }
? ? public String getMsg() {//取出事件參數(shù)? ? ? ? return msg;
? ? }
? ? public void setMsg(String msg) {
? ? ? ? this.msg = msg;
? ? }
}