Как получать события шины событий, когда активность находится в фоновом режиме

Я хочу получить уведомление с помощью службы уведомлений Firebase. Я отправляю сообщение из Firebase, все в порядке.

Я хочу получить это уведомление, если пользователь запускается в MainActivity, также я хочу показывать всплывающее окно с помощью диалога.

Если пользователь запускает другие действия, например SettingActivity или ProfileActivity, в любом случае обработчик уведомлений и всплывающее окно запуска пользователя 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));
        }
    }
}

ГлавнаяАктивность

@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);
}

person TeyteyLan    schedule 06.04.2017    source источник


Ответы (1)


Вы звоните unregister() в onStop(), поэтому вы не получаете события, когда MainActivity находится в фоновом режиме.

Чтобы получать события, даже когда Activity находится в фоновом режиме, необходимо зарегистрироваться в onCreate() и отменить регистрацию в onDestroy() (а не в onResume()/onStop()).

Переместите следующую строку в onCreate():

EventBus.getDefault().register(this);

А этот к onDestroy():

EventBus.getDefault().unregister(this);

Также ознакомьтесь с жизненным циклом активности.

person earthw0rmjim    schedule 06.04.2017
comment
Вы спасли мое время. Спасибо !! - person TeyteyLan; 06.04.2017
comment
Нет такого идеального решения, как это - person MrinmoyMk; 19.07.2021