Уведомлять активность из службы

Я пытаюсь запустить Service из моего Activity, чтобы следить за изменениями на веб-странице, это личное приложение, поэтому я не беспокоюсь о времени автономной работы...

Но я бы хотел передать данные из моего Service в мой Activity... Кажется, я не могу найти способ вызвать Activity из моего Service. Как я могу достичь этого?

Ответы

Ответ 1

Как указал Алекс, вы можете привязываться к службе и передавать какой-то прослушиватель или обратный вызов службе, которая будет использоваться для событий.

Или вы можете использовать широковещательную рассылку Intent, возможно, используя методы типа setPackage() на Intent, чтобы ограничить область широковещательной передачи.

Или вы можете использовать createPendingResult() для создания PendingIntent, который вы передаете в качестве Intent дополнительно к сервису, - служба может затем использовать этот PendingIntent для запуска onActivityResult() в вашей деятельности.

Или вы можете использовать ResultReceiver.

Или вы можете использовать Messenger.

(по общему признанию, я не пробовал эти последние два подхода, но я думаю, что они будут работать здесь)

Ответ 2

Еще одна альтернатива: если ваша служба обновляет контент-провайдера, активность может быть уведомлена через ContentObserver. Этого было бы достаточно, если бы ваша служба загружала некоторые данные с сервера, и вы просто хотите отображать новое содержимое в этом мероприятии.

Ответ 3

Некоторые уродливые способы:

1.) Если активность еще не началась, используйте intent и startActivity, но помните intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

2.) В противном случае, если действие уже началось, вы можете написать свой собственный метод обратного вызова в действии и зарегистрировать метод в службе, а затем прямо вызвать метод в службе.

Надеюсь найти какой-нибудь умный способ.

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

Ответ 4

Механизм ResultReceiver объяснен в другом сообщении: Сервис Restful API Однако это не будет работать во всех случаях. Пожалуйста, обратитесь к моему комментарию на эту должность. Механизм ограниченного охвата или механизм PendingIntent кажутся более подходящими.