在 Activity、片段和服务之间共享相同数据实例的最佳方式?

Best way to share same data instance between an Activity, Fragment and Service?

我是一名业余 android 开发人员,我制作了一个音乐播放器应用程序,我需要在我的 Activity、Fragment 和 Service 以及所有他们能够操纵对象的状态。用户可以 play/pause/next/prev 一首歌曲,如果歌曲处于暂停或播放状态,它们都需要显示相同的当前歌曲信息和歌曲状态。

我的Activity可以通过持久化在所有片段上的底部布局改变歌曲状态。 我的碎片可以通过播放列表页面 choosing/pausing 首歌曲更改歌曲状态。 我的服务可以通过pausing/resuming/next/prev首歌曲通过通知栏更改歌曲状态。

我很难想出在何处以及如何存储对象实例的解决方案。 我想过让它们都有一个 Song 对象实例,并通过发送广播来更新值,但我认为这不是最好的解决方案,而且看起来很草率。

要播放的歌曲 URL 也是从服务器检索的。拨打 API 电话的最佳地点在哪里?

如果有人可以就如何执行此操作提出更好的方法,我们将不胜感激。谢谢!

此致,

您可以创建具有 activity 范围的 ViewModel,它将在 Fragment/Activity/Service 之间共享。

class AudioPlayerViewModel: ViewModel {
    val songLiveData = MutableLiveData<Song>()
    
    fun playSong() {
        // Todo your logic
    }
    
    fun stopSong() {
        // Todo your logic
    }
    
    .
    .
    .
}

您对歌曲所做的每项更改都将通过 ViewModel 完成,Fragment/Activity/Service 将观察 songLiveData 中发生的更改并相应地更新 UI。

关于网络请求我建议你看看retrofit库。一种常见的做法是使用将保存所有网络和数据库调用的存储库模式,之后您可以在 ViewModel 中获取存储库的实例并执行该网络调用。您可以使用协程或 RxJava 来处理线程。

总结:

Activity/Fragment/View/Services...

负责 UI 交互,观察来自 ViewModel 的数据并根据该数据进行 UI 更改。

视图模型

负责网络层与用户所见之间的交互。他们修改数据,因此 UI 可以保持愚蠢并且不包含任何逻辑。

存储库

负责 API 和数据库调用。