android - 服务- fragment 通信

标签 android android-intent android-service rx-java greenrobot-eventbus

一个 Activity 包含一个 Fragment,它又包含一个子 Fragment,它请求一个 Service。该应用程序尝试实现 dobjanschi休息架构。

Service 完成工作时,它必须传播操作结果。我尝试使用 PendingIntent 但它似乎只被 Activity 捕获,而我需要子 fragment 才能得到通知。你能提出什么建议吗? Binder ?绿色机器人事件总线? RxJava(我已经在项目中了)?

谢谢。

最佳答案

RxJava

一个简单的方法是使用 Singleton 来包装同步的“PublishSubject”

 * Singleton
 * 
 * to send an event use EventBusRx.getInstance().topic1.onNext("completed");
 */
public class EventBusRx {
    private static EventBusRx ourInstance = new EventBusRx();
    public static EventBusRx getInstance() {
        return ourInstance;
    }
    private EventBusRx() {}

    /**
     * Use of multiple topics can be usefull
     * SerializedSubject avoid concurrency issues
     */
    public final Subject<String, String> topic1 = new SerializedSubject<>(PublishSubject.create());
    public final Subject<Integer, Integer> topic2 = new SerializedSubject<>(PublishSubject.create());
}

并且您可以从服务发送事件

EventBusRx.getInstance().topic1.onNext("completed");

并在 fragment 中或任何时候响应事件

public class MyFragment extends Fragment {

    // [...]

    Subscription subscription_topic1;

    @Override
    public void onResume() {
        super.onResume();

        subscription_topic1 = EventBusRx.getInstance().topic2
                .subscribeOn(AndroidSchedulers.mainThread()) // or on other sheduler
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        // update ui
                    }
                });
    }

    @Override
    public void onPause() {
        // important to avoid memory leaks
        subscription_topic1.unsubscribe();
        super.onPause();
    }
}

不要忘记取消订阅

这个想法类似于 Roger'one 使用单例但强制执行 ThreadSafety 包装 PublishSubject。

不需要 Observable.switchOnNext(subject)

EventBus 库

greenRobot Eventbus 和 Otto 都不错并且具有相同的功能,但缺点是它们使连接更加困惑(特别是 EventBus)。如果您已经在使用 rx,我认为最好继续使用它

这是一篇关于该主题的鼓舞人心的文章 Implementing an Event Bus With RxJava

本地广播

执行此操作的经典方法是使用 LocalBroadcastManager但在我看来,它们是一种痛苦

关于android - 服务- fragment 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26140026/

相关文章:

android - 媒体播放器服务安卓

Android marketplace 私有(private)应用程序是否为硬件独占?

java - 避免两次实现方法(已经扩展抽象类的类)

Android 对讲辅助功能 - 自定义声音

java - Android BluetoothGattService - 异常无法编码

android - 无法在 WindowManager 中调用 onClickListener

java - Android MediaPlayer 不会通过单击另一个按钮而停止

android - 调用 closeDrawers 时抽屉导航不关闭 - 计时问题

java - 在 Activity 之间发送数据 Intent 错误

java - 在后台播放音乐文件时,根据服务中的 MediaPlayer 对象更新 Activity 中的 Ui 组件