Связь между Сервисом, Вебом и Активностью, вперед и назад, в Android

1

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

Что я имею

У меня есть служба, которая запускается из моего приложения. Он проверяет текущее местоположение пользователя и вызывает веб-службу с местом чтения. Это происходит каждые х метров.

Что я хочу получить

  • Проведите операцию с картой и отобразите текущие данные местоположения из службы. Это означает, что моя активность должна быть проинформирована о каждом прочитанном месте. Имейте в виду, что это будет использоваться только тогда, когда пользователь начнет свою деятельность, поэтому я не думаю, что трансляция каждого местоположения из службы была бы хорошей идеей.
  • Активность, в которой я могу запросить услугу для ее последнего места для чтения.
  • Как я упоминал ранее, служба считывает местоположение и должна отправлять его на веб-сервер каждые несколько секунд. Какой был бы лучший подход для этого? В службе создайте новый поток() для каждого вызова веб-службы? Использовать AsyncTask? Иногда я могу получить в качестве ответа некоторые дополнительные значения, случай, когда мне нужно запустить Activity из веб-службы.

Сказав это, что бы вы посоветовали мне использовать? Будет ли это хорошим подходом: Пример: связь между деятельностью и службой с использованием сообщений?

LE: Я переключился с IntentService на простой поток службы + для отправки данных в веб-службу. Моя реализация IntentService началась и быстро уничтожена. Наверное, я сделал что-то не так....

  • 0
    как насчет использования интерфейса для отправки данных из Сервиса в Активность при получении новых данных в Сервисе?
Теги:
broadcastreceiver
service
intentservice

2 ответа

3
Лучший ответ

Это означает, что моя активность должна быть проинформирована о каждом прочитанном месте.

Я считаю, что чистое и эффективное решение для вашей цели - использовать 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 где вы сможете делать то, что вам нужно.

  • 0
    Я перешел с IntentService на простой сервис. Возможно, я сделал что-то не так с моей реализацией, но мой IntentService запустился и быстро разрушился. Поэтому я переключился на Service + поток и теперь он работает. Спасибо за Ваш ответ.
  • 1
    Работал отлично;) Спасибо большое.
0

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

В приведенной статье говорится о том, как передавать данные из службы в пользовательский интерфейс, кроме пользовательского интерфейса, который запустил его... и, хотя это не ваш вопрос/проблема, вы все равно можете использовать один и тот же шаблон.

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

При завершении операции вы останавливаете службу, а затем удаляете себя как обратный вызов обработчика.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню