Android 哪些活动生命周期方法最适合注册/注销到事件总线?

Android 哪些活动生命周期方法最适合注册/注销到事件总线?,android,otto,greenrobot-eventbus,Android,Otto,Greenrobot Eventbus,在活动中,向事件总线(如otto、EventBus或tinybus)注册和取消注册的最佳位置是什么?为什么 onCreate()-onDestroy() onStart()-onStop() onResume()-onPause() Otto的示例使用onResume()-onPause(),EventBus提到onStart()-onStop(),我们需要在应用程序中使用onCreate()-onDestroy()来更新活动的UI,即使它在后台也是如此。 因此,根据事件的性质和处理方式,我猜这

在活动中,向事件总线(如otto、EventBus或tinybus)注册和取消注册的最佳位置是什么?为什么

  • onCreate()-onDestroy()
  • onStart()-onStop()
  • onResume()-onPause()
  • Otto的示例使用onResume()-onPause(),EventBus提到onStart()-onStop(),我们需要在应用程序中使用onCreate()-onDestroy()来更新活动的UI,即使它在后台也是如此。
    因此,根据事件的性质和处理方式,我猜这可能是三个问题中的任何一个,但我想知道是否还有其他问题需要考虑。

    首先,这不是一个客观的问题,而是一个主观的问题,并且会根据论点得出很多论点

    根据我的经验,
    我们在一个项目中使用了。我们遵循了onResume()-onPause(),这对我们很有帮助。这也是有道理的,因为在使用事件总线时,我们应该尽可能晚地注册并尽可能快地取消注册。

    我删除了我在上述回答中的评论,即最好在onresume/onpause中注册/取消注册。我得到了一个奇怪的用例,其中一些if事件没有到达带注释的订阅者。似乎最好的方法是使用onstart/onstop。下面是一篇很好的SO帖子,解释了原因:


    @levavare,我认为注册/取消注册的正确时间取决于您的事件以及您打算如何处理这些事件。对于同一应用程序中的不同事件,可以是不同的

    例如,我在Android应用程序中使用EventBus,该应用程序通过蓝牙监控实时数据记录设备(本例中为Arduino)。我有两种完全不同的活动

    第一个事件由我的蓝牙代码发布,通知我的一个片段已从设备接收到一组新的仪器读数。然后,该片段将它们写入数据库表。重要的是,事件总是被听到并付诸行动。片段在其OnCreate/OnDestroy方法中注册/注销。我还以更高的优先级订阅了该活动

    将新记录添加到数据库时,数据库层将发布另一个事件。我有一系列片段,显示不同的读数子集(温度、压力、报警条件)。当查看其中一个片段时,它应该在数据库中有新的读数时立即更新。但当碎片看不见时,就没有理由对读数起作用。我在OnStart/OnStop中注册/注销了这些片段。我打算在OnResume/OnPause中完成这项工作,坦率地说,我认为它在我的应用程序中也同样有效。但是@Jordy的回答和链接说服我改为使用OnStart/OnStop

    我找到的Form EventBus,它对我来说很好:

    如果您需要将EventBus引用发送给孩子,则:


    “尽可能晚&尽可能快地取消注册”-谢谢,很好的观点,从事件分布的性能角度来看也是有意义的,我想,尽管我不确定这到底有多重要。但我认为,从“重新开始”到“暂停”,并在需要时“向上”是有道理的。我认为,根据情况采取行动是最好的策略。如果这符合你的目的,请你接受这个答案好吗?如果应用程序在后台时丢失已发送的事件呢?@Gianfranco Android的设计是在后台放弃活动。。。当应用程序开发人员在您旋转屏幕等各种情况下不处理此问题时,您会看到问题。特别是在512MB的1MB设备上,活动可能会消失。如果你需要一个随时响应事件的应用程序,那么构建一个随时运行并向活动提供数据的服务。您可以更进一步,通过通知成为前台服务。您将在音乐播放器应用程序中看到这种类型的设计。谢谢!我在问题中添加并更新了它。答案仍然不明显,我想,如果有任何明确的答案,我会再次更新。在我看来,使用消息总线解决了我们的一些问题,并可以产生其他一些问题。是的,启动/停止更好,因为它可以在手机锁定时接收消息。或者说,接收到的GCM消息可以通过OttoI传递给活动。我还需要使用
    onCreate()-onDestroy()
    。你发现什么缺点了吗?@zack,没有,我当时没有发现任何缺点,但它只是一个PoC应用程序,所以不是一个广泛的应用程序experience@levavare,请将以下答案中的一个标记为已接受。听起来你似乎已经决定同意Jordy的答案/链接,但这没有最多的赞成票,因此很难找到。@agunn我还没有看到一个答案列出每个答案的考虑因素、优点和缺点。onResume()-onPause()可能会导致对话框丢失事件,所以最好不要使用,但在我看来,在onStart()-onResume()和onCreate()-onDestroy()之间做出决定取决于我们是否希望在应用程序处于后台时处理事件。(例如:我们可能想更新UI(即使当时没有显示),但不想开始新的活动)@levavare,我同意你的“视情况而定”观察。请参见下面我的答案+示例案例。
    @Override
     public void onStart() {
         super.onStart();
         EventBus.getDefault().register(this);
     }
    
     @Override
     public void onStop() {
         super.onStop();
         EventBus.getDefault().unregister(this);
     }
    
    private EventBus eventBus = EventBus.getDefault();
    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            .......
    }
    
    @Override
    public void onStart() {
        super.onStart();
        if(!eventBus.isRegistered(this)){
            eventBus.register(this);
        }else{
            Log.e(TAG, "EventBus is registered");
        }
    }
    
    @Override
    public void onStop() {
        super.onStop();
        if(eventBus.isRegistered(this)){
           eventBus.unregister(this);
        }else{
           Log.e(TAG, "EventBus is not registered");
        }
    }