将我的图书馆服务与我的应用程序进行通信的最佳方法

Best approach to communicate my library service with my app

我的项目中有一个库正在使用服务来侦听通知。我想要做的是当通知到达时,从处理通知的库中通知应用程序。

我不知道如何从库中注意到该应用程序。我正在尝试做一个界面,但我无法初始化界面,不确定这是否是一个好方法。

这是我想要做的:

在应用程序中 class:

val notification = object: PushNotificationInterface {
            override fun listenForPush(remoteMessage: RemoteMessage) {
             //Do something
            }
        }

接口:

interface PushNotificationInterface {

    fun listenForPush(remoteMessage: RemoteMessage)

}

图书馆class:

class HMSPushMessagingService: HmsMessageService() {

    override fun onNewToken(token: String) {
        super.onNewToken(token)
        PushToken.token = token
    }

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        super.onMessageReceived(remoteMessage)

        //This line give an error in PushNotificationInterface(remoteMessage)
        interfaceTest(listenerInterface = PushNotificationInterface(remoteMessage), remoteMessage = remoteMessage)
    }

    private fun interfaceTest(listenerInterface: PushNotificationInterface, remoteMessage: RemoteMessage) {
            listenerInterface.listenForPush(remoteMessage)
    }
}

这是一种使用 StateFlow 的方法

class HMSPushMessagingService: HmsMessageService() {

    companion object {
        val messages = MutableStateFlow<RemoteMessage?>(null)
    }

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        super.onMessageReceived(remoteMessage)
        messages.value = remoteMessage
    }
}

StateFlow 是一个 SharedFlow,因此您可以从应用中的许多地方收集它

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        lifecycleScope.launchWhenStarted {
            HMSPushMessagingService.messages.collect {
                val remoteMessage = it
                // do something
            }
        }
        // or
        HMSPushMessagingService.messages.onEach {
            // do something
        }.launchIn(lifecycleScope)
    }
}

详细了解 StateFlow here