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; } }