我已经开发了一个接收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
}
祝好运!