碰到了EventBus发送的事件接收不到的状况,调试后发现是已经被注销的问题。java
首先注册和注销应该在向Activity生命周期中相对应的位置,由于Activity生命周期就是相对应的调用的,如onCreate和onDestory,onStart和onStop,onResume和onPause,若是调用到了onStop,下次出现就会从onStart开始。因此在注册后要在其相对的生命周期进行注销。ide
不建议在onResume中,由于onResume出现的频率大,因此要重复调用(针对重复调用的状况,调用注册前必定判断还未注册再去注册,无论在哪一个生命周期都会更稳妥一点)。并且有时候Activity被异常回收,没有调用onPause方法,这样会致使EventBus没有注销。this
@Override protected void onStart() { super.onStart(); if(!EventBus.getDefault().isRegistered(this)){ //注册 EventBus.getDefault().register(this); } } @Override protected void onStop() { super.onStop(); if (EventBus.getDefault().isRegistered(this)){ //注销 EventBus.getDefault().unregister(this); } }
官方推荐的是在onStart中注册,在onStop注销,说明这样作更好,在Activity中这样作目前还没遇到问题,由于从一个Activity中跳转到另外一个Activity中前一个Activity会调用到onPause,并不会调用onStop,因此不会被注销,EventBus依然能够正常接收。调试
可是今天放在fragment中的时候出现接收不到问题,并非Activity异常回收,而是必现状况,是在Fragment+ViewPager的主页面应用场景下,在主页面的某一Fragment中onStart中注册EventBus,在onStop注销。在Fragment中跳转到另外一个Activity中。这时候主页面的Activity会onStop,因此里面的Fragment也都会onStop,因此EventBus被注销了,也就接收不到事件了。code
像这种跳转后会onStop的状况就是在onCreate中去注册,在onDestory中去注销。生命周期