Сообщать об активности из BroadcastReceiver ТОЛЬКО в том случае, если она находится на переднем плане
-
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();
}
Приемник получит сигнал тревоги только тогда, когда ваша активность находится на переднем плане :)
(Извините, если мой английский непонятен)