Я прочитал большинство вопросов и ответов вокруг SO, и я должен сказать, что до сих пор не знаю, по каким причинам идти в моем случае. Есть несколько способов пойти, но я не могу решить, какой из них лучше всего подходит для моего дела.
Что я имею
У меня есть служба, которая запускается из моего приложения. Он проверяет текущее местоположение пользователя и вызывает веб-службу с местом чтения. Это происходит каждые х метров.
Что я хочу получить
Сказав это, что бы вы посоветовали мне использовать? Будет ли это хорошим подходом: Пример: связь между деятельностью и службой с использованием сообщений?
LE: Я переключился с IntentService на простой поток службы + для отправки данных в веб-службу. Моя реализация IntentService началась и быстро уничтожена. Наверное, я сделал что-то не так....
Это означает, что моя активность должна быть проинформирована о каждом прочитанном месте.
Я считаю, что чистое и эффективное решение для вашей цели - использовать ResultReceiver.
Примечание: (Ниже вы увидите пример из моего приложения).
Пример:
Деятельность от ее вызова Услуга.
Intent i = new Intent(this, DownloadService.class);
i.putExtra("url", "http://dl.dropbox.com/u/67617541/2011-11-11_102220_nature.jpg");
i.putExtra("receiver", new DownloadReceiver(new Handler()));
startService(i);
Реализованный ResultReceiver
private class DownloadReceiver extends ResultReceiver {
public DownloadReceiver(Handler handler) {
super(handler);
}
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
super.onReceiveResult(resultCode, resultData);
if (resultCode == DownloadService.PROGRESS_UPDATE) {
int progress = resultData.getInt("progress");
pd.setProgress(progress);
}
}
}
И фрагмент IntentService
protected void onHandleIntent(Intent intent) {
String urlLink = intent.getStringExtra("url");
ResultReceiver receiver = intent.getParcelableExtra("receiver");
// some body
Bundle data = new Bundle();
//publishing progress
receiver.send(PROGRESS_UPDATE, data);
}
Поэтому просто вызов метод send
(when onReceiveResult
) будет вызван onReceiveResult
в вашем ResultReceiver
где вы сможете делать то, что вам нужно.
Другой подход, который следует предпринять с этим, - использовать обработчик в соответствии с этим ответом.
В приведенной статье говорится о том, как передавать данные из службы в пользовательский интерфейс, кроме пользовательского интерфейса, который запустил его... и, хотя это не ваш вопрос/проблема, вы все равно можете использовать один и тот же шаблон.
В основном ваша активность, когда она начнется, будет регистрироваться как обратный вызов обработчика и запустить службу определения местоположения. Служба определения местоположения отправит сообщения на обратный вызов обработчика и будет обрабатываться вашей деятельностью.
При завершении операции вы останавливаете службу, а затем удаляете себя как обратный вызов обработчика.
Если служба всегда работает, но не знает, есть ли пользовательский интерфейс или нет, то этот шаблон также можно использовать, поскольку обработчик прокси проверяет, существует ли реальный обратный вызов, а если нет, то сообщение просто отброшен.