Android中Activity、Service、Fragment之間的相互通信比較麻煩,主要有以下一些方法: (1)使用廣播,發送者發出廣播,接收者接收廣播後進行處理; (2)使用Handler和Message,如下載線程完成下載任務後,給UI發送Message,UI收到Message後更新界面。 ...
Android中Activity、Service、Fragment之間的相互通信比較麻煩,主要有以下一些方法:
(1)使用廣播,發送者發出廣播,接收者接收廣播後進行處理;
(2)使用Handler和Message,如下載線程完成下載任務後,給UI發送Message,UI收到Message後更新界面。
但是這些方法都比較繁瑣,一種比較簡單有效的方法就是使用事件匯流排。事件匯流排的基本原理是發送者把消息發送到事件匯流排,然後事件匯流排在接收者中查找哪些方法註冊了這個事件,如果某個方法註冊了這個事件,就觸發該方法。這樣實現組件之間的通信要比其他方法簡單得多,代碼也更加簡潔。
1.下載simple_eventbus.jar,並導入Android工程,並且在需要發送或接收消息的組件裡面import下麵兩個類:
import org.simple.eventbus.EventBus; import org.simple.eventbus.Subcriber;
2.新建兩個Activity:MainActivity和Activity2。其中MainActivity作為消息的接收者,Activity2作為消息的發送者。由於這兩個Activity都要使用事件匯流排,在onCreate(Bundle savedInstanceState)中需要註冊EventBus:
EventBus.getDefault().register(this);
在onDestroy()中需要註銷EventBus:
EventBus.getDefault().unregister(this);
3.在Activity2中新建一個Button,onClick()方法如下:
@Override public void onClick(View v) { switch (v.getId()){ case R.id.btnRun2: num++; txtStatus.setText("點擊了" + num + "次!"); EventBus.getDefault().post(new Object(), "my_tag"); break; default: break; } }
每點擊一次Button,就使用EventBus.getDefault().post()方法向EventBus發送一次消息。EventBus.getDefault().post()有兩個參數:第一個參數是向事件接收者傳遞的對象,由於我們這裡不需要向發送者傳遞對象,所以只new了一個Object;第二個參數是tag,相當於廣播裡面的action,只有接收者裡面註冊了這個tag的方法才會被觸發,沒有註冊這個tag的方法就不會被觸發。
4.在MainActivity中新建接收消息的方法:
@Subcriber(tag = "my_tag") private void updateUI(Object o){ num++; txtStatus.setText("Activity 2 點擊了" + num + "次!"); Log.e("num=", String.valueOf(num)); }
其中@Subcriber(tag = "my_tag")註解表明該方法是一個消息接收方法,tag = "my_tag"表明該方法註冊了"my_tag"這個消息,接收到該消息該方法就會被觸發。
5.運行結果。進入Activity 2,6次點擊Button:
再回到MainActivity,可以看到updateUI()被觸發,顯示出了Activity 2的點擊次數: