Android периодически отправляет данные из сервиса в Activity - PullRequest
4 голосов
/ 15 октября 2011

У меня есть приложение, которое запускает службу при первом запуске.После этого он периодически получает данные с сервера.

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

  2. Если действие не выполняется, то должно отображаться уведомление.

Итак, второй пункт был самым простым и законченным.Я застрял в пункте 1. Как периодически отправлять данные на активность из сервиса?Я использую базу данных для хранения данных.

Любая помощь по этому вопросу?

1 Ответ

10 голосов
/ 15 октября 2011
  • Ваша служба может отправлять «Сообщения» в свою активность Messenger, чтобы заставить ее реагировать, как только служба обнаруживает новый контент (см. в этом разделе справки Android-разработчиков об активности / обмене сообщениями в службах).).

Вот примеры двусторонних сообщений (от Сервиса к Активности и от Активности к Сервису).Цитируя документ:

Вы можете увидеть пример того, как обеспечить двусторонний обмен сообщениями в MessengerService.java (служба) и MessengerServiceActivities.java (клиент) образцы.

Вот соответствующие части.

Входящий обработчик в действии:

    /**
     * Activity Handler of incoming messages from service.
     */
    class IncomingHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MessengerService.MSG_SET_VALUE:
                    mCallbackText.setText("Received from service: " + msg.arg1);
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }

    /**
     * Activity target published for clients to send messages to IncomingHandler.
     */
    final Messenger mMessenger = new Messenger(new IncomingHandler());

В сервисе показаны только соответствующие части:

/**
 * Handler of incoming messages from clients.
 */
class IncomingHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        //obtain Activity address from Message
        Messenger mClient=msg.replyTo;
        try { 
        // try to send it some mValue
           mClient.send(Message.obtain(null,MSG_SET_VALUE, mValue, 0));
        } catch (RemoteException e) {
          // The client is dead.  Remove it
          mClient=null;
        }
    }
}

/**
 * Target we publish for clients to send messages to IncomingHandler.
 */
final Messenger mMessenger = new Messenger(new IncomingHandler());
  • Также вы можете bind к вашему сервису из вашей деятельности и периодически вызывать один из ваших сервисных методов для проверки нового контента.Для этого, если ваш сервис является другим приложением, вы должны использовать aidl (это сложнее).Если он находится в том же пакете, я советую вам использовать гораздо более легкую ' привязку локальной службы '
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...