Сообщать об активности из BroadcastReceiver ТОЛЬКО в том случае, если она находится на переднем плане

StackOverflow https://stackoverflow.com/questions/2282435

  •  21-09-2019
  •  | 
  •  

Вопрос

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

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

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

Есть какие-нибудь намеки на то, как это сделать?Спасибо!

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top