Activity 間的數據通訊,對於數據量比較大的,避免使用 Intent + Parcelable
的方式,能夠考慮 EventBus 等替代方案,以避免形成 TransactionTooLargeException。java
EventBus是一款Android下的發佈/訂閱事件總線機制。能夠代替Intent、Handler、Broadcast等在Fragment、Activity之間傳遞消息。ide
優勢:開銷小,代碼優雅。將發送者和接受者解耦。post
第一步須要先導入依賴this
implementation 'org.greenrobot:eventbus:3.1.1'
自定義事件類線程
public class MessageEvent { private String message; public MessageEvent(String message) { this.message = message; } public String getMessage(){ return message; } public void getMessage(String message){ this.message = message; } }
註冊事件代碼code
//註冊 EventBus EventBus.getDefault().register(this);
解除註冊xml
//解註冊EventBus if (EventBus.getDefault().isRegistered(this)){ EventBus.getDefault().unregister(this); }
發送事件事件
EventBus.getDefault().post(new MessageEvent("這是經過第二個頁面發送的事件"));
處理事件get
處理消息的方法名字能夠隨便取。可是須要加一個註解@Subscribe,而且要指定線程模型。it
@Subscribe(threadMode = ThreadMode.MAIN) public void Event(MessageEvent messageEvent) { main_tv.setText(messageEvent.getMessage()); }
下面是完整代碼
主頁面
ublic class MainActivity extends AppCompatActivity { private TextView main_tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //註冊 EventBus EventBus.getDefault().register(this); main_tv = findViewById(R.id.activity_main_tv); } @Subscribe(threadMode = ThreadMode.MAIN) public void Event(MessageEvent messageEvent) { main_tv.setText(messageEvent.getMessage()); } @Override protected void onDestroy() { super.onDestroy(); //解註冊EventBus if (EventBus.getDefault().isRegistered(this)){ EventBus.getDefault().unregister(this); } } //點擊按鈕調轉到第二個Activity public void jumpToSecond(View view) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } }
第二個頁面
public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } // 按鈕點擊事件 public void sendMessage(View view) { //往第一個頁面發送事件 EventBus.getDefault().post(new MessageEvent("這是經過第二個頁面發送的事件")); //關閉當前Activity finish(); } }
消息處理類
public class MessageEvent { private String message; public MessageEvent(String message) { this.message = message; } public String getMessage(){ return message; } public void getMessage(String message){ this.message = message; } }