我使用firebase发送通知。当应用程序位于前台时,通知将由扩展FirebaseMessagingService
的类接收。所以在onMessageReceived
,我这样做:
EventBus.getDefault().postSticky(new NotificationEvent(body, title, url));
我有两个活动就是这个活动的听众。活动A和活动B.
在这两项活动中,我这样做:
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void consumeNotification(NotificationEvent event) {
//Consume event
}
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
Log.d(TAG, "onStart called");
}
@Override
public void onStop() {
NotificationEvent event = EventBus.getDefault().getStickyEvent(NotificationEvent.class);
if (event != null) {
EventBus.getDefault().removeStickyEvent(event);
}
EventBus.getDefault().unregister(this);
super.onStop();
Log.d(TAG, "onStop called");
}
现在,活动A中有一个按钮,用于启动活动B.
如果屏幕上显示活动A,并且我收到通知(触发事件),则第一次消耗该事件。
因此,当我单击按钮以启动活动B时(在活动A上调用onStop
),但令人惊讶的是,当活动B在onStop
时被删除时,活动B中再次收到该事件在活动A中调用。
此外,如果活动B在屏幕上可见并且我收到通知(触发事件),则该事件也会在第一次消耗。
但是,当我点击物理后退按钮返回活动A时,活动A中的活动将被删除。
请问,这应该是什么原因以及如何解决?
注意:我选择使用棒状事件,因为如果我使用非粘性事件,则当屏幕在任何一项活动中被视为关闭时,不会传递事件。
答案 0 :(得分:1)
看起来你需要在EventBus.getDefault().removeStickyEvent(event);
内拨打consumeNotification(NotificationEvent event)
并在EventBus.getDefault().unregister(this);
onStop()