OTTO和其他活动中的碎片

Kit*_*fer 7 android-fragments android-activity otto

我昨天开始使用Square的OTTO,到目前为止,我有一个良好的开端.

当您的片段已经托管在FragmentActivity中时,Otto可以很好地开箱即用,您只需要在FragmentActivity托管的Fragment之间进行通信.

在托管时,您的#onResume()Methode被调用,Fragment可以在Eventbus上注册自己:

@Override
public void onResume()
{
    super.onResume();
    BusProvider.getInstance().register(this);
}
Run Code Online (Sandbox Code Playgroud)

我的问题:

片段嵌入在一个额外的 Activity中,它应该通过Eventbus接收事件,如下所示:

public AnotherFragmentHostedInSomeActivity extends Fragment
{
         .....

    @Subscribe
    public void onSomethingHappend(final Event event)
    {

          final SomeObject deliveredObject = event.getSomeObject();
Run Code Online (Sandbox Code Playgroud)

但是当你想在那里调用托管片段的另一个活动时,看起来事情仍然很复杂:

public class SomeFragmentSendingDataToAnotherFragment extends Fragment
{
            ...
    private void sendData()
    {
            final Intent intent = new Intent(applicationContext, SomeActivity.class);
            applicationContext.startActivity(intent);                                 
            BusProvider.getInstance().post(new Event(someObject));
Run Code Online (Sandbox Code Playgroud)

正如您可能已经看到的,这段代码很狡猾.启动一个Activity然后将Data发送到该Activity托管的Fragment,因为生命周期不能正常工作.因此,活动也会被创建,而Fragements也会被创建.有时会调用onResume Methode,因此Fragement可以使用@Subscribe注册.但这一切都发生事件已经通过EventBus发布.因此,拦截的片段永远不会被EventBus调用.

任何人都知道如何以聪明的方式做到这一点?

那里还有一些额外的信息:我昨天和奥托一起玩得很好.当我需要将数据发送到另一个活动时,问题只出现在我的项目中,在我的情况下,当APP在智能手机上运行时,而不是平板电脑上运行.在我通过Intent和Parcelable发送所有数据之前.Otto会减少编写Parcleable Objects的需求,所以我想这样做.

谢谢你的回答

Eri*_*rke 16

到第二个Activity开始时,原来的Activity就不见了.正如其他人所指出的,如果你想将数据从Activity传递给Activity,使用Intents可能是最好的途径.

如果你真的想要一个事件总线,你需要一个即使在第一个活动消失后仍然存活的对象.在Android中,这与应用程序上下文相关联,或者使用Dagger或Guice,@ Singleton.

这个单例是你使用Otto的@Produce注释的地方.当第二个Activity订阅总线时,它将从该@Produce方法接收任何数据.