Информировать активность из BroadcastReceiver ТОЛЬКО, если он находится на переднем плане

Возможно, это легко, но я до сих пор не мог понять это правильно... У меня есть BroadcastReceiver, ожидающий срабатывания AlarmMangager - это отлично работает.

Теперь: поскольку событие, если оно происходит, должно обновить некоторые элементы на экране основной операции, я бы хотел отправить Intent из этого фона BroadcastReceiver в свою активность - , но только, если он в настоящее время находится на переднем плане, также известный как.

Если он не работает или не отображается, мне все равно - и последнее, что я хочу сделать, - это начать действие по моим намерениям! Я обрабатываю перерисовку представлений в моем методе onResume(), поэтому мне все равно.

Любые подсказки о том, как это сделать? Спасибо!

EDIT: мой BroadcastReceiver ждет тревог, которые должны быть уведомлены пользователю. Итак, оно должно быть там и объявлено в манифесте. Проблема в том, что он должен будет решить, находится ли упомянутая деятельность в настоящее время впереди или нет.

Ответ 1

Итак, это почти ответ Бино, но: вместо того, чтобы перемещать приемник в действие, используйте два приемника с разными намерениями. Первым из них является ваш первоначальный сигнал тревоги Intent, с получателем, зарегистрированным в манифесте, как вы уже есть, и затем этот приемник отправляет второе намерение трансляции, которое обрабатывается получателем, зарегистрированным в активности, как говорит Бино.

Я сделал это в своем собственном проекте таймера, на github. Вот приемник сигналов тревоги и ресивер-получатель. Надеюсь, что это поможет.

Ответ 2

Я считаю, что теперь вы знакомы с AlarmManager (создаете новый будильник, регистрируете приемник...), поэтому я не буду об этом говорить. Просто дайте вам решение по вашему вопросу.

Вместо того, чтобы регистрировать BroadcastReceiver в файле класса и в манифесте, вы создаете только новый BroadcastReceiver в своей деятельности, а затем регистрируете его в методе onResume и отмените его в методе onPause, как это показано в вашей деятельности:

private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      //do something       
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mIntentFilter = new IntentFilter();
    mIntentFilter.addAction("your alarm action");
    ...
}

@Override
protected void onResume() {
registerReceiver(mIntentReceiver, mIntentFilter);
    ...
super.onResume();
}

@Override
protected void onPause() {
unregisterReceiver(mIntentReceiver);
    ...
super.onPause();
}

Приемник получит только сигнал тревоги, когда ваша деятельность находится на переднем плане:)

(Извините, если мой английский не ясен)