2

我在 Github 中有以下项目:https ://github.com/alirezaeiii/ExoPlayer-Service我使用 Assets 中的 ExoPlayer 播放音乐。

当我点击播放/暂停按钮时,我向播放/暂停 ExoPlayer 发送广播:

public void playPauseClick(View view) {
        isPlaying = !isPlaying;
        Intent intent = new Intent(STR_RECEIVER_SERVICE);
        intent.putExtra(IS_PLAYING, isPlaying);
        sendBroadcast(intent);
}

这是我在我的 Android 服务中注册的 BroadcastReceiver :

private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            boolean isPlaying = intent.getBooleanExtra(IS_PLAYING, false);
            mExoPlayer.setPlayWhenReady(isPlaying);
        }
    };

另一种方法是使用 Rx-Subject。所以在我的活动中,我使用 onNext() 播放/暂停 ExoPlayer :

public void playPauseClick(View view) {
     isPlaying = !isPlaying;
     PLAYING_SUBJECT.onNext(isPlaying);
}

在服务中,我有以下 Disposable,我在 onDestroy() 中进行了处理:

public static final Subject<Boolean> PLAYING_SUBJECT = PublishSubject.create();

private final Disposable mPlayingDisposable = PLAYING_SUBJECT.subscribe(new Consumer<Boolean>() {
        @Override
        public void accept(Boolean isPlaying) {
            mExoPlayer.setPlayWhenReady(isPlaying);
        }
    });

广播和 Rx-Subject 都按预期工作,但在您看来,哪一个比另一个更可取,为什么在我的情况下?

4

1 回答 1

2

切勿使用 IPC(进程间通信)在您自己的进程内进行通信。它不仅浪费资源,而且还引入了安全问题。例如,任何应用程序都可以向您发送该广播。

你是使用 RxJava 还是其他进程中的东西(Kotlin 的SharedFlow,LiveData等)取决于你。但是,请不要将系统广播用于进程内通信。

于 2021-01-04T20:33:07.307 回答