Android中一個Activity關(guān)閉另一個Activity或者在一個Activity中關(guān)閉多個Activity

前言

最近項目中涉及需要在一個Activity中關(guān)閉另一個Activity或者在一個Activity中關(guān)閉多個Activity的需求,不涉及到應(yīng)用的退出。自己首先想了一些方案,同時也查了一些方案,就各個方案總結(jié)出比較合適的一種方案。

EventBus是一款針對Android優(yōu)化的發(fā)布/訂閱事件總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優(yōu)點是開銷小,代碼更優(yōu)雅,以及將發(fā)送者和接收者解耦。

EventBus框架中涉及四個成分

訂閱者,發(fā)布者,訂閱事件,事件總線?

它們的關(guān)系可以用官方的圖表示:


訂閱者可以訂閱多個事件,發(fā)送者可以發(fā)布任何事件,發(fā)布者同時也可以是訂閱者。

如何使用

官方給到四個步驟(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://訂閱事件的動作@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://訂閱事件的動作@Subscribepublic void onEvent(AnyEventType event) {/* Do something */};

(4)Post events://發(fā)布者發(fā)送事件eventBus.post(event);

在項目中,最主要用到的EventBus的方法有:

EventBus.getDefault().register(this);//訂閱事件EventBus.getDefault().post(object);//發(fā)布事件EventBus.getDefault().unregister(this);//取消訂閱onEvent:使用onEvent作為訂閱函數(shù),那么該事件在哪個線程發(fā)布出來的,onEvent就會在這個線程中運行,也就是說發(fā)布事件和接收事件線程在同一個線程。onEventMainThread:無論事件在哪個線程發(fā)布出來的,始終在UI線程中執(zhí)行訂閱事件的操作。onEventBackground:無論事件在哪個線程發(fā)布出來的,始終在工作線程中執(zhí)行訂閱事件的操作。onEventAsync:使用這個函數(shù)作為訂閱函數(shù),那么無論事件在哪個線程發(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)前界面注冊一個訂閱者? ? ? ? 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);//取消注冊? ? }

}

登錄界面LoginActivity.java:

@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));

定義一個登錄成功事件類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;

? ? }

}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容