碰到了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中去註銷。生命週期