如何将数据从 FCM 的 onMessageReceived() 发送到 Fragment?

Zor*_*gan 8 android mvvm kotlin firebase firebase-cloud-messaging

我正在使用 Firebase Cloud Messaging 在我的应用中接收数据:

class CustomFirebaseMessagingService : FirebaseMessagingService() {

    override fun onMessageReceived(msg: RemoteMessage?) {
        val data = msg?.data ?: return
        val name = data["name"] as String
        val age = data["age"]?.toIntOrNull() ?: return
        val bio = data["bio"] as String
        val img1 = data["img1"] as String
        val match = Profile(name, age, bio, img1, null, null)
        Log.d(TAG, "onMessageReceived(): $name is $age")
        val fcmViewModel = ViewModelProviders.of(this).get(FcmViewModel::class.java) // .of() only takes a fragment/activity
        FcmViewModel().match.postValue(match)
        Log.d(TAG, "Value: " + FcmViewModel().match.value.toString()) // null
        super.onMessageReceived(msg)
    }
Run Code Online (Sandbox Code Playgroud)

当我收到 FCM 时,我想将它传递给我的 Fragment。我尝试使用 LiveData + ViewModel,但不幸的postValue()是,实际上并没有从服务更改 ViewModel 中的数据,因为我无法从服务实例化对 ViewModel 的引用。

class FcmViewModel : ViewModel() {

    val match: MutableLiveData<Profile> by lazy {
        MutableLiveData<Profile>()
    }
}

class MapFragment : Fragment() {

        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            fcmViewModel.match.observe(this, Observer<Profile> { profile ->
            log("${profile.name} is ${profile.age}") // doesn't print
        })
    } 
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法从数据传递FirebaseMessagingService()到我的片段或发布方式数据FcmViewModel()中的FirebaseMessagingService()

Har*_*edi 12

随着LocalBroadcastManager标示为淘汰,它好像有现在这样的没有标准的方式。

不过LiveDataViewModels. 您仍然可以使用LiveData. 我会推荐他评论过的@tyczj 的解决方案。或者您可以执行以下操作。

创建一个单例类,它将用作您的小型事件总线框架。这个单例类可以包含LiveData您需要的列表,Fragment并且Service可以访问 LiveData 的实例。Service 和 Fragment 可以充当生命周期所有者,因此您不会遇到任何问题。

下面是一个sudo代码

object Events {
    val serviceEvent: MutableLiveData<String> by lazy {
        MutableLiveData<String>()
    }
}

class CustomFirebaseMessagingService : FirebaseMessagingService() {
    override fun onMessageReceived(msg: RemoteMessage?) {
        Events.serviceEvent.postValue(profileObj)
        super.onMessageReceived(msg)
    }
}
class MapFragment: Fragment {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        Events.serviceEvent.observe(this, Observer<Profile> { profile ->
            log("${profile.name} is ${profile.age}")
        })
}
Run Code Online (Sandbox Code Playgroud)

您还可以通过覆盖和函数创建自己的子类LiveData并控制数据更新LiveDataonActiveonInactive