我已经开发了一个接收Firebase推送通知的应用程序。该应用程序中有一个聊天部分,可在特定的ChatActivity中使用。该服务如下所示:

class PushNotificationsService : FirebaseMessagingService() {

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
       showPushNotification(remoteMessage)
    }
}


如果我的ChatActivity是可见的,我不想显示推送通知。

有什么更普遍或更恰当的方式来处理这种情况?

我尝试了以下选项,但不确定100%是否可以在生产中正常使用:


通过ChatActivity检查所有时间SharedPreferences生命周期
通过应用程序ChatActivity中定义的静态变量检查所有时间Application.class生命周期

最佳答案

我认为选项2)可能效果很好。您只需在Application类中有一个布尔isChatActivityVisible变量,然后根据活动的生命周期将其打开或关闭即可。

您也可以查看此链接以获取更多想法:Android: how do I check if activity is running?

以后编辑:

我认为您也可以尝试使用广播的另一种方法,并让广播接收器来处理推送。另一种方法是使用Greenrobot的EventBus并处理通过它的推送。在这种情况下,您可以在onStart()/ onStop()(或onPause()/ onResume())方法中注册和注销EventBus,并将推送作为pojo发送。它会根据您的需要自动运行。

首先,您需要在build.gradle(app)文件中添加其依赖项:

implementation 'org.greenrobot:eventbus:3.1.1'

您将在ChatActivity中拥有以下内容:

override fun onResume(){
    super.onResume()
    EventBus.getDefault().register(this)
}

override fun onPause(){
    EventBus.getDefault().unregister(this)
    super.onPause()
}


然后,无论您收到什么推送,都将使用:

EventBus.getDefault().post(YourChatPushNotificationEvent(message))


在您的情况下,这将是:

class PushNotificationsService : FirebaseMessagingService() {

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
       EventBus.getDefault().post(YourChatPushNotificationEvent(remoteMessage))
    }
}


其中YourChatPushNotificationEvent包含您想要进入ChatActivity的任何有效负载(这是一个简单的pojo,您可以在其中放置任何内容,在这种情况下,它具有在构造函数中传递的String消息)。如果做对了,我看不出为什么这行不通。随着应用程序的进一步开发,它可能会增加应用程序的复杂性,但是我想,如果您正确命名事件,则可以解决。

为了处理刚刚发出的事件,您可以在ChatActivity中使用它:

@Subscribe(threadMode = ThreadMode.MAIN)
    fun onYourChatPushNotificationEvent(event: YourChatPushNotificationEvent) {
    //do whatever you need to do in here with the payload that is in the event object
}


祝好运!

10-08 12:14