哪一个更好:Rx主题还是Android广播接收器

哪一个更好:Rx主题还是Android广播接收器,android,broadcastreceiver,rx-java2,subject-observer,Android,Broadcastreceiver,Rx Java2,Subject Observer,我在Github中有以下项目:在那里我使用来自资产的ExoPlayer播放音乐 当我点击播放/暂停按钮时,我向播放/暂停播放器发送广播: public void playPauseClick(View view) { isPlaying = !isPlaying; Intent intent = new Intent(STR_RECEIVER_SERVICE); intent.putExtra(IS_PLAYING, isPlaying);

我在Github中有以下项目:在那里我使用来自资产的ExoPlayer播放音乐

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

public void playPauseClick(View view) {
        isPlaying = !isPlaying;
        Intent intent = new Intent(STR_RECEIVER_SERVICE);
        intent.putExtra(IS_PLAYING, isPlaying);
        sendBroadcast(intent);
}
public void playPauseClick(View view) {
     isPlaying = !isPlaying;
     PLAYING_SUBJECT.onNext(isPlaying);
}
这是我在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主题。因此,在我的活动中,我使用onNext()播放/暂停ExoPlayer:

public void playPauseClick(View view) {
        isPlaying = !isPlaying;
        Intent intent = new Intent(STR_RECEIVER_SERVICE);
        intent.putExtra(IS_PLAYING, isPlaying);
        sendBroadcast(intent);
}
public void playPauseClick(View view) {
     isPlaying = !isPlaying;
     PLAYING_SUBJECT.onNext(isPlaying);
}
在服务中,我有以下一次性的,我在onDestroy()中处理:

public static final Subject PLAYING_Subject=PublishSubject.create();
private final Dispossible Emplaying Dispossible=PLAYING_SUBJECT.subscribe(新消费者(){
@凌驾
公共无效接受(布尔值显示){
mExoPlayer.setPlayWhenReady(iPlay);
}
});

广播和接收主题均按预期工作,但从您的角度来看,哪一个更适合另一个,以及为什么在我的情况下?

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


是否使用RxJava或其他正在进行的操作(Kotlin的
SharedFlow
LiveData
,等等)取决于您。但是,请不要将系统广播用于进程内通信。

谢谢您让我知道浪费资源的情况,但关于安全性,我们可以在清单中设置android:exported=“false”,因此其他应用程序无法发送该广播。你同意吗?@Ali:“你同意吗?”——那么你的接收者将无法访问
mExoPlayer
,除非你正在做一些可怕的事情(例如,使
mExoPlayer
成为
静态的
)。我假设此接收器是通过在
上下文中调用的
registerReceiver()
注册的,并且在该场景中没有与
android:exported=“false”
等效的。您是对的,它是通过registerReceiver()注册的。谢谢你的帮助。