如何在Activity处于后台时接收事件总线事件

时间:2017-04-06 09:02:36

标签: android firebase notifications firebase-notifications greenrobot-eventbus

我想使用Firebase Notification服务获取通知消息。我从Firebase发送邮件,没关系。

如果用户在MainActivity中运行,我想收到此通知我还想使用对话框显示弹出窗口。

如果用户运行其他活动,例如SettingActivityProfileActivity,则无论如何都会通知处理,并且会突然显示用户运行MainActivity弹出窗口。

要做到这一点,我使用的是Greenbot Eventbus。当我在MainActivity内并且通知出现时,它似乎没问题。但是当我在另一个Activity通知中未来时。

如何处理此消息,直到MainActivity

public class NotificationService  extends FirebaseMessagingService {
    private static final String TAG = "evenBus" ;

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);


        Log.d(TAG, "onMessageReceived");
        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
            // do nothing if Notification message is received
            Log.d(TAG, "Message data payload: " + remoteMessage.getNotification().getBody());
            String body = remoteMessage.getNotification().getBody();
            EventBus.getDefault().post(new NotificationEvent(body));
        }
    }
}

MainActiviy

@Override
    protected void onResume(){
       EventBus.getDefault().register(this);
 }

// This method will be called when a MessageEvent is posted (in the UI thread for Toast)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(NotificationEvent event) {
    Log.v("onMessageEvent","Run");
    Toast.makeText(MainActivity.this, event.getBody(), Toast.LENGTH_SHORT).show();
    alertSendActivity("title",event.getBody());
}

@TargetApi(11)
protected void alertSendActivity(final String title,final String data) {
    alt = new AlertDialog.Builder(this,
            AlertDialog.THEME_DEVICE_DEFAULT_LIGHT).create();
    alt.setTitle(title);
    alt.setMessage(data);
    alt.setCanceledOnTouchOutside(false);
    alt.setCancelable(false);
    alt.setButton(AlertDialog.BUTTON_NEUTRAL, getString(R.string.ok),
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                    alt.dismiss();
                }
            });

    alt.show();
}

protected void onStop() {
    super.onStop();
     EventBus.getDefault().unregister(this);
}

1 个答案:

答案 0 :(得分:3)

您在[{1}}中呼叫unregister(),因此当onStop()位于后台时您不会收到任何事件。

即使MainActivity位于后台也要接收活动,您应该在Activity注册并在onCreate()取消注册(而不是onDestroy() / {{1} })。

将以下行移至onResume()

onStop()

这一个到onCreate()

EventBus.getDefault().register(this);

另请查看Activity Lifecycle