Информировать активность только от BroadcastReceiver, если он находится на переднем плане - PullRequest
23 голосов
/ 17 февраля 2010

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

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

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

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

РЕДАКТИРОВАТЬ: мой BroadcastReceiver ожидает сигналов тревоги, которые должны быть уведомлены пользователю. Итак, оно должно быть там и заявлено в манифесте. Проблема в том, что он должен решить, будет ли упомянутое действие в данный момент активным.

Ответы [ 2 ]

43 голосов
/ 17 февраля 2010

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

Вместо регистрации 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();
}

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

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

38 голосов
/ 19 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...